Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2012, 07:30   #1
Che-Che
 
Аватар для Che-Che
 
Регистрация: 21.05.2012
Сообщений: 5
По умолчанию Ошибка при инициализации объеста класса

Есть класс:

Код:
class Quest{
	char * question;
	char ** answer;
	int answer_numb;
	int truestate;

public:
	Quest(char*, char**, int, int);	//Конструктор
	Quest();						//Конструктор по умолчанию
	Quest(Quest&);					//Конструктор копии
	~Quest();							//Деструктор
	char * get_quest();				//Создает копию вопроса в динамической памяти и возвращает указатель на начало вопроса
	char * get_answer(int number);	//Создает копию ответа в динамической памяти и возвращает указатель на начало ответа
	int get_true();					//Возвращает значение номера правильного ответа
	int get_answer_numb();			//Возвращает значение количества ответов
	void copy(Quest);				//Копирует аргумент в объект класса
	
};

Теперь создаем объект:

Код:
Quest A("abc",{"abs","ab"},2,1);
И получаем ошибку:

Код HTML:
Ошибка	13	error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)	C:\Users\Golandec93\Documents\Visual Studio 2010\Projects\WinformTest\WinformTest\tabl.cpp	5
Перелопатил кучу форумов - есть такие же ошибки, но решения внятного так и не увидел.
На MSDN тоже ничего не написано.
Объясните пожалуйста в чем дело.))

Использую Microsoft Visual C++ Express 2010
Che-Che вне форума Ответить с цитированием
Старый 22.05.2012, 08:07   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А тела где? Или это и весь код?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.05.2012, 20:12   #3
Che-Che
 
Аватар для Che-Che
 
Регистрация: 21.05.2012
Сообщений: 5
По умолчанию

Нет конечно)

вот код конструкторов:

Код:
Quest::Quest(char* q, char**a, int state=0, int ans_nmb=0)
{
	question=new char[strlen(q)];
	strcpy(question,q);
	for(int i=0; i<ans_nmb; i++){
		answer[i]=new char[strlen(a[i])];
		strcpy(answer[i],a[i]);
	}
	truestate=state;
	answer_numb=ans_nmb;
}
Код:
Quest::Quest()
{
	question="\0";
	answer=new char*[1];
	*answer="\0";
}
Код:
Quest::Quest(Quest& t)
{
	question=new char[strlen(t.get_quest())];
	strcpy(question,t.get_quest());
	for(int i=0; i<t.get_answer_numb(); i++)
	{
		answer[i]=new char[strlen(t.get_answer(i))];
		strcpy(answer[i],t.get_answer(i));
	}
	truestate=t.get_true();
	answer_numb=t.get_answer_numb();
}
Che-Che вне форума Ответить с цитированием
Старый 22.05.2012, 21:44   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Quest(char*, char**, int, int); //Конструктор
А имена параметров-переменных где? Упустил?
Код:
// qq.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <string>

class Quest{
	char * question;
	char ** answer;
	int answer_numb;
	int truestate;

public:
	Quest(char* q, char**a, int state=0, int ans_nmb=0)
	{
		question=new char[strlen(q)];
		strcpy(question,q);
		for(int i=0; i<ans_nmb; i++){
			answer[i]=new char[strlen(a[i])];
			strcpy(answer[i],a[i]);
		}
		truestate=state;
		answer_numb=ans_nmb;
	}

	Quest(){
		question="\0";
		answer=new char*[1];
		*answer="\0";
	}						//Конструктор по умолчанию

	Quest(Quest& t){
		question=new char[strlen(t.get_quest())];
		strcpy(question,t.get_quest());
		for(int i=0; i<t.get_answer_numb(); i++)
		{
			answer[i]=new char[strlen(t.get_answer(i))];
			strcpy(answer[i],t.get_answer(i));
		}
		truestate=t.get_true();
		answer_numb=t.get_answer_numb();
	}					//Конструктор копии
	~Quest();							//Деструктор
	char * get_quest();				//Создает копию вопроса в динамической памяти и возвращает указатель на начало вопроса
	char * get_answer(int number);	//Создает копию ответа в динамической памяти и возвращает указатель на начало ответа
	int get_true();					//Возвращает значение номера правильного ответа
	int get_answer_numb();			//Возвращает значение количества ответов
	void copy(Quest);				//Копирует аргумент в объект класса

};




int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}
I'm learning to live...

Последний раз редактировалось Stilet; 22.05.2012 в 21:47.
Stilet вне форума Ответить с цитированием
Старый 22.05.2012, 22:12   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Виталий, в объявлении не обязаны быть параметры.

дело тут скорее в массиве при инициализации, помоему не хочет оно так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.05.2012, 22:22   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Дык это... То что я выложил скомпилилось. Я конечно не запускал эту кашу в компот, но всетки - компиляция прошла.
Цитата:
в объявлении не обязаны быть параметры.
Ок. Хотя я считаю это дикостью.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.05.2012, 22:26   #7
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Stilet, что с Вами? Зачем Вы реализации функций в класс то внесли?
В классе обычно только описание пишут, там имена и не нужны.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 22.05.2012, 22:28   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Виталий, ТС как бы выложил строку с ошибкой.

и да, у вас компилится ибо нет той самой строки .
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 22.05.2012 в 22:32.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.05.2012, 08:07   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Зачем Вы реализации функций в класс то внесли?
Почему бы и нет Есть причины не делать этого? (а я ведь так всегда делаю, и пока программы работают нормально - юзера не жалуются)
Цитата:
у вас компилится ибо нет той самой строки .
Ну дык ошибки нет - задача решена
Или важно какой ценой?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.05.2012, 10:03   #10
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Почему бы и нет
Функции, реализованные внутри класса, считаются inline, т.е. для компилятора они кандидаты на то, чтобы вставить их прямо в код вместо вызова функции. К тому же, реализация inline-функции должна быть в каждой единице трансляции, и если Вы будете собирать программу из нескольких файликов, то получите фейл.

Да и некрасиво это)

Автору темы - проблема то в {"abs","ab"}. Честно говоря, не знаю, как это работало раньше, но теперь это список инициализации)
Форматируйте код, будьте людьми.

Последний раз редактировалось Granus; 23.05.2012 в 10:05.
Granus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц