Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не компилируется - error request for member .. in .. which is of non-class type .. / 22 сообщений из 22, страница 1 из 1
11.11.2016, 23:48
    #39345976
Касалапый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется - error request for member .. in .. which is of non-class type ..
Учусь вот... Вооружившись Гуглом наваял такой код...
Код: 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
12.11.2016, 00:16
    #39345987
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется - error request for member .. in .. which is of non-class type ..
Код: 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
12.11.2016, 06:23
    #39346016
Касалапый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется - error request for member .. in .. which is of non-class type ..
Код: 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
12.11.2016, 10:05
    #39346033
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется - error request for member .. in .. which is of non-class type ..
Слишком старый компилятор или компиляция происходит с ключом "компилировать в режиме с++98"
...
Рейтинг: 0 / 0
12.11.2016, 11:52
    #39346064
Касалапый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется - error request for member .. in .. which is of non-class type ..
мм... Есть какие-то варианты для режима "с++98"?
И где-то надо освобождать этот params?
...
Рейтинг: 0 / 0
12.11.2016, 12:41
    #39346075
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется - error request for member .. in .. which is of non-class type ..
Касалапый,

Код: 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
12.11.2016, 16:06
    #39346100
Касалапый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется - error request for member .. in .. which is of non-class type ..
омм... Спасибо! Это единственный вариант записи?
А почему не надо освобождать? В двух словах если?
...
Рейтинг: 0 / 0
13.11.2016, 06:00
    #39346293
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется - error request for member .. in .. which is of non-class type ..
Касалапыйомм... Спасибо! Это единственный вариант записи?
А чем вам не нравится? )))

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

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

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


Код: 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
17.11.2016, 10:18
    #39348846
Касалапый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется - error request for member .. in .. which is of non-class type ..
// инициализацию нужно выполнять по возможности в инициализаторе, вызывая конструктор. тут эта возможность есть.
Это не очень понял, а у меня что-то не там что ли?
// этот метод должен быть const.
Обязательно? Что конкретно может случиться, если оставить так?
// попробуй написать это через новый цикл for each.
// попробуй написать это без цикла вообще через алгоритмы (copy, back inserter)
Спасибо, почитаем/поищем.
// такое в старом стандарте не должно вроде бы компилироваться.
Ну ругается только на то что я показал, а это как раз компилится (если отдельно).
// system - нестандартная функция, не используй. std::get_line() Или что-то подобное.
Благодарю, будем знать!
...
Рейтинг: 0 / 0
17.11.2016, 16:30
    #39349248
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется - error request for member .. in .. which is of non-class type ..
Касалапый,

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


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

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

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

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


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

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


да.

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

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


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