Задать вопрос

Не выводится масссив строк | наследование в С++ | Как исправить?

В классе С2 есть метод для вывода массива строк и этот метод работает правильно. В классе C3 есть другой метод для вывода массива строк с шириной поля, но он не выводит массив строк, который объявлен в классе С2, хотя класс С3 является наследником класса С2. Когда я вставил в метод другую строку, то выведение на консоль было. Поэтому сделал вывод, что дело в наследовании.

#include <iostream>
#include <Windows.h>
#include <iomanip>
#include <string>
using namespace std;
class C1
{
public:
	string myString;
	void inputString()
	{
		cout << "Укажіть рядок ";
		cin >> myString;
	}
	void outputString()
	{
		cout << myString << endl;
	}
};
class C2 : public C1
{
public:
	string *arrayStrings;
	int size;
	C2()
	{
		size = 5;
		arrayStrings = new string[size];
	}
	void inputArray()
	{
		cout << "Укажіть масив рядків ";
		for (int i = 0; i < size; i++)
		{
			cin >> arrayStrings[i];
		}
	}
	void outputArray()
	{
		for (int i = 0; i < size; i++)
		{
			cout << arrayStrings[i].c_str() << endl;
		}
	}
};
class C3 : public C2
{
private:
	int textColor;
	int backgroundColor;
	int width;
public:
	C3(int t, int b, int w)
	{
		textColor = t;
		backgroundColor = b;
		width = w;
	}
	void setColor()
	{
		HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
		SetConsoleTextAttribute(hStdOut, (WORD)(backgroundColor << 15) | textColor);
	}
	void outputArray()
	{
		for (int i = 0; i < size; i++)
		{
			cout << setw(width) << arrayStrings[i].c_str() << endl;
		}
	}
};
int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	C1 a;
	a.inputString();
	a.outputString();
	C2 b;
	b.inputArray();
	b.outputArray();
	C3 c(14, 0, 15);
	c.setColor();	
	c.outputArray();
	return 0;
}
  • Вопрос задан
  • 74 просмотра
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@majstar_Zubr
C++, C#, gamedev
Дело не в наследовании, а в том, что вы не проинициализировали массив для объекта с с помощью вызова c.inputArray(). Реализуете конструктор копирования для удобства.

Есть ещё некоторые критичные проблемы в вашем коде:
1) у C2 нет деструктора с освобождением памяти.
2) у C2 поля публичные, особенно плохо, что выставлен владеющий raw указатель.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы