У меня проблемы с полиморфизмом. Я установил, что эти базовые классы методы будут добавлены позже, но я хочу, чтобы различные члены данных были доступны из этого класса.
class square
{
public:
bool canBeBought;
string name;
};
class property : public square
{
public:
int rent;
int colour;
int cost;
bool bought;
};
class specialSquare : public square
{
private:
public:
};
Вот код, который я звоню
square* properties[23];
for(int i = 0; i < 23; i++)
{
if(propertyStrings.at(i).substr(0,8) == "Property")
{
istringstream ss(propertyStrings.at(i).substr(11,21));
string temp;
properties[i] = new property;
while(!ss.eof())
{
properties[i]->bought = false;
properties[i]->name = propertyStrings.at(i).substr(0,11);
cout << "Name: " << properties[i]->name << endl;
ss >> temp;
properties[i]->cost = atoi(temp.c_str());
cout << "Cost: "<< properties[i]->cost << endl;
ss >> temp;
properties[i]->rent = atoi(temp.c_str());
cout << "Rent: "<< properties[i]->rent << endl;
ss >> temp;
properties[i]->colour = atoi(temp.c_str());
cout << "Colour: "<< properties[i]->colour << endl << endl;
break;
}
}
}
Моя проблема в том, что, поскольку переменная name находится в квадратном классе, она работает нормально, но члены-данные для класса свойств не распознаются. Моя цель состояла в том, чтобы попытаться получить все квадратные данные, хранящиеся в одном массиве, который является классом свойства и классом specialSquare, так как это впоследствии облегчит мою программу.
Я предполагаю, что ваша проблема в том, что компилятор не распознает ваши указатели «свойств» как указывающие на экземпляры класса Property, потому что вы сохранили их как указатели на Square. Приведение свойств [i] к указателю на класс Property (((property*)properties[i])->colour
) должен сделать свое дело (вы явно указываете компилятору, что это фактически тот класс, и вы убедились, что это не может быть другой класс).
Если Property и Special_Square на самом деле не являются квадратами, полиморфизм здесь может быть неправильным выбором. Есть другие способы выполнить задачу, например, по массиву вариантов.
Почему у вас просто нет массива производного типа?
Должен ли массив содержать несколько типов квадратов?
Если это так, их вы можете использовать dynamic_cast<> изменить тип указателя.
Однако я бы не использовал массив указателей. Если вы используете одну из библиотек std, вы избавите себя от головной боли благодаря управлению памятью …
void DoSomething(std::vector<property>& properties)
{
// do something with...
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<property> properties;
property x;
x.cost = 1234;
properties.push_back(x);
DoSomething(properties);
return 0;
}
Это нормально, потому что Свойства [I] это площадь указатель, посмотрите на ваше объявление:
square* properties[23];
Это означает, что вы можете получить доступ только к площадь члены класса, которые canBeBought а также название.
Решение состоит в том, чтобы заменить:
properties[i] = new property;
от:
property * prop = new property;
properties[i] = prop;
Тогда в вашем в то время как петля, просто используйте проп> вместо свойства [я] ->.