powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не компилируется - error request for member .. in .. which is of non-class type ..
22 сообщений из 22, страница 1 из 1
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39345976
Касалапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Учусь вот... Вооружившись Гуглом наваял такой код...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
#include <iostream>
#include <vector>

using namespace std;

class TestClass {
	private:
		vector<string> _p;
	public:
		TestClass(vector<string> p) {
			_p.reserve(_p.size() + p.size());
			_p.insert(_p.end(), p.begin(), p.end());
		}
		string toString() {
			string result = "";
			for (int i = 0; i < _p.size(); i++) {
				result += _p[i];
				result += "\n";
			}
			return result;
		}
};

int main(int argc, char** argv) {
	cout << "\n\n\n\tHello World!\n\n\n";
	string params[] = { "a", "b", "c" };
	TestClass Test( vector<string>( params ) );
	cout << Test.toString();
	cout << "\n\n\n";
	system("pause");
	return 0;
}


Не компилится:
Код: plaintext
1.
2.
3.
test.cpp: In function 'int main(int, char**)':
test.cpp:_:_: error: request for member 'toString' in 'Test', which is of non-class type 'TestClass(std::vector<std::__cxx11::basic_string<char> >)'
  cout << Test.toString();
               ^

Помогите кто-то... Кто-то помогите... (с)
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39345987
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
	cout << "\n\n\n\tHello World!\n\n\n";
	vector<string> params = { "a", "b", "c" };
	TestClass Test = TestClass(params);
	cout << Test.toString();
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39346016
Касалапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
test.cpp: In function 'int main(int, char**)':
test.cpp:_:_: error: in C++98 'params' must be initialized by constructor, not by '{...}'
  vector<string> params = { "a", "b", "c" };
                                          ^
test.cpp:_:_: error: could not convert '{"a", "b", "c"}' from '<brace-enclosed initializer list>' to 'std::vector<std::__cxx11::basic_string<char> >'
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39346033
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слишком старый компилятор или компиляция происходит с ключом "компилировать в режиме с++98"
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39346064
Касалапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мм... Есть какие-то варианты для режима "с++98"?
И где-то надо освобождать этот params?
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39346075
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Касалапый,

Код: plaintext
1.
2.
3.
4.
5.
6.
vector<string> params;
params.push_back("a");
params.push_back("b");
params.push_back("c");
TestClass Test = TestClass(params);
cout << Test.toString();



vector и string - освобождать не надо.
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39346100
Касалапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
омм... Спасибо! Это единственный вариант записи?
А почему не надо освобождать? В двух словах если?
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39346293
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Касалапыйомм... Спасибо! Это единственный вариант записи?
А чем вам не нравится? )))

Касалапый А почему не надо освобождать? В двух словах если?
Освобождать через delete нужно только то, что вы создали с помощью new.
Так как при использовании vector и string в этом коде вы new не вызываете (что не удивительно, т.к. автоматическое управление памятью является одной из задач решаемых этими классами), то и освобождать ничего не надо.
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39346408
Касалапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё раз спасибо!
Просто думал может можно передать в конструктор TestClass конструктор vector, без объявления дополнительных переменных...
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39346479
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Касалапый Просто думал может можно передать в конструктор TestClass конструктор vector, без объявления дополнительных переменных...
В древних версиях языка это невозможно.
В современных, начиная с С++11 можно:
Код: plaintext
1.
TestClass Test = TestClass({"a", "b"});
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39346532
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Написав эти строки, ты подумал объяснить нубу подноготную, почему это будет работать?

Или почему не работало первоначально ???
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39346550
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНаписав эти строки, ты подумал объяснить нубу подноготную, почему это будет работать?
Или почему не работало первоначально ???
Зачем объяснять, если у него древний компилятор?
А объяснять почему первоначально не работало должен был первый ответивший
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39346731
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
несколько комментариев по коду:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
#include <iostream>
#include <vector>

using namespace std;

class TestClass {
	private:
		vector<string> _p;
	public:
		TestClass(vector<string> p) {
			_p.reserve(_p.size() + p.size());
			_p.insert(_p.end(), p.begin(), p.end());
		}
// инициализацию нужно выполнять по  возможности в инициализаторе,  вызывая конструктор. тут эта возможность есть. 
		string toString() {
// этот метод должен быть const. 
			string result = "";// инициализаторе лишний
			for (int i = 0; i < _p.size(); i++) {
				result += _p[i];
				result += "\n";
			}
     // попробуй написать это через новый цикл for each. 
    // попробуй написать это без цикла вообще через алгоритмы  (copy, back inserter) 
			return result;
		}
};

int main(int argc, char** argv) {
	cout << "\n\n\n\tHello World!\n\n\n";
	string params[] = { "a", "b", "c" };
// такое в старом стандарте не должно вроде бы компилироваться. 
	TestClass Test( vector<string>( params ) );
	cout << Test.toString();
	cout << "\n\n\n";
	system("pause");
// system - нестандартная функция,  не используй. std::get_line() Или что-то подобное. 
	return 0;
}
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39348846
Касалапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
// инициализацию нужно выполнять по возможности в инициализаторе, вызывая конструктор. тут эта возможность есть.
Это не очень понял, а у меня что-то не там что ли?
// этот метод должен быть const.
Обязательно? Что конкретно может случиться, если оставить так?
// попробуй написать это через новый цикл for each.
// попробуй написать это без цикла вообще через алгоритмы (copy, back inserter)
Спасибо, почитаем/поищем.
// такое в старом стандарте не должно вроде бы компилироваться.
Ну ругается только на то что я показал, а это как раз компилится (если отдельно).
// system - нестандартная функция, не используй. std::get_line() Или что-то подобное.
Благодарю, будем знать!
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39349248
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Касалапый,

не правда ли, так немного проще ?
Код: plaintext
1.
2.
3.
TestClass::TestClass(vector<string> p) : _p(p)
{
}
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39349253
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КасалапыйОбязательно? Что конкретно может случиться, если оставить так?


Коллеги тебя зажарят и съедят...
Сначала убьют, конечно...
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39349273
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivСначала убьют, конечно...ой, не факт ))
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39349522
Касалапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, серьёзно, что будет-то? Хотелось бы полностью понимать.
так немного проще ?
ого... Такое не показывали нам... Как будет точное название?
Это что получится тогда, при вызове конструктора TestClass вызывается конструктор vector<string> и присваивается переменной _p ещё до выполнения тела конструктора?
Но у меня ж как бы не присваивание, а добавление в конец...
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39349530
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Нет, серьёзно, что будет-то? Хотелось бы полностью понимать.
метод, не меняющий состояние класса должен быть объявлен как const, что значительно упростит жизнь клиентам твоего класса. Используя его не надо будет задумываться, не разрушит ли объект его вызов в данном контексте. Чем больше в интерфейсе класса константных методов, тем проще им пользоваться.

>>Как будет точное название?
список инициализаторов конструктора

>>Это что получится тогда, при вызове конструктора TestClass вызывается конструктор vector<string> и присваивается переменной _p ещё до выполнения тела конструктора?
для переменной _p будет вызван конструктор инициализации, он же - конструктор копирования

>>Но у меня ж как бы не присваивание, а добавление в конец...
...пустого вектора ))
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39349552
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КасалапыйНет, серьёзно, что будет-то? Хотелось бы полностью понимать.Ещё добавлю, в чём суть проблемы: твои методы могут возвращать ссылки и указатели, которые другой код может поменять, порушив тебе валидную информацию. В твоём примере ты сам формируешь строчку, но мог бы, для гибкости, возвращать ссылку на _p, чтобы другой код мог сам интерпретировать его, как нужно. Всё ок, но если тот код начнёт манипулировать данными, можно получить UB. Если ты объявишь метод как const, то в случае попытки изменения данных класса, полученных этим методом, компилятор выдаст ошибку.
Для ещё большей наглядности, ты возвращаешь указатель, который потом через ряд функций куда-то идёт, где другие кодеры чешут репу и говорят, блин, тут условие не работает, потому что указатель ненулевой, а должен быть нулевой, по идее. И зануляют. Потом их зажарят и съедят управление по стеку возвращается тебе, и ты, как ни в чём ни бывало, обращаешься за данными по своему указателю, потому что ты в этом месте в своём коде его изменения не предполагал.
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39349706
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КасалапыйНет, серьёзно, что будет-то? Хотелось бы полностью понимать.
так немного проще ?
ого... Такое не показывали нам... Как будет точное название?


я тебе писал его в прошлый раз!

КасалапыйЭто что получится тогда, при вызове конструктора TestClass вызывается конструктор vector<string> и присваивается переменной _p ещё до выполнения тела конструктора?
Но у меня ж как бы не присваивание, а добавление в конец...


да.

у тебя добавление в конец пустого массива, при создании объекта массив всегда пустой, согласен?

я конечно может что-то не учел, но вроде бы код эквивалентный.
...
Рейтинг: 0 / 0
Не компилируется - error request for member .. in .. which is of non-class type ..
    #39350372
Касалапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь вроде всё ясно! Спасибо всем!
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не компилируется - error request for member .. in .. which is of non-class type ..
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]