переменные — полиморфизм и члены данных переполнение стека

У меня проблемы с полиморфизмом. Я установил, что эти базовые классы методы будут добавлены позже, но я хочу, чтобы различные члены данных были доступны из этого класса.

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, так как это впоследствии облегчит мою программу.

0

Решение

Я предполагаю, что ваша проблема в том, что компилятор не распознает ваши указатели «свойств» как указывающие на экземпляры класса Property, потому что вы сохранили их как указатели на Square. Приведение свойств [i] к указателю на класс Property (((property*)properties[i])->colour) должен сделать свое дело (вы явно указываете компилятору, что это фактически тот класс, и вы убедились, что это не может быть другой класс).

Если Property и Special_Square на самом деле не являются квадратами, полиморфизм здесь может быть неправильным выбором. Есть другие способы выполнить задачу, например, по массиву вариантов.

1

Другие решения

Почему у вас просто нет массива производного типа?
Должен ли массив содержать несколько типов квадратов?
Если это так, их вы можете использовать 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;
}
0

Это нормально, потому что Свойства [I] это площадь указатель, посмотрите на ваше объявление:

square* properties[23];

Это означает, что вы можете получить доступ только к площадь члены класса, которые canBeBought а также название.

Решение состоит в том, чтобы заменить:

properties[i] = new property;

от:

property * prop = new property;
properties[i] = prop;

Тогда в вашем в то время как петля, просто используйте проп> вместо свойства [я] ->.

0
По вопросам рекламы [email protected]