C++: констуктор

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

C++: констуктор

Сообщение IMB »

Доброго дня!
Пишу программу на C++, параллельно изучаю читая Шилда и Страуструпа, так сложились обстоятельста.
Есть базовый класс Thread от которого наследует класс Capture.

Код: Выделить всё

public:
        Capture(enum format_t format, unsigned int width, unsigned int height):
            Thread();
        ~Capture();

Насколько я понял, этой конструкцией я создаю объект Thread и объект Capture.
Но при компиляции я получаю сообщения о ошибке:

Код: Выделить всё

capture.hpp: In constructor ‘Capture::Capture(format_t, unsigned int, unsigned int)’:
capture.hpp:29: error: expected `{' at end of input

Таким образом получается, что если я в конструкторе поставлю {} я не смогу в нём выполнить некоторые действия, а хотелось бы, например, провести присваивание переменных.
Как это возможно решить?
Спасибо.
Спасибо сказали:
Ramol
Сообщения: 44
ОС: Debian

Re: C++: констуктор

Сообщение Ramol »

Ну это надо писать в сpp файле (принайме я всегда пишу там :rolleyes: )

Код: Выделить всё

Capture::Capture(format_t format, unsigned int width, unsigned int height)
{
  // некоторые действия, провести присваивание переменных.
}


Если конструктор базового класа имеет дефолтный конструктор и тебе он подходит то можна пропустить вызов базового конструктора если нет то пишем

Код: Выделить всё

Capture::Capture(format_t format, unsigned int width, unsigned int height)
:Thread(//переменые которые нужны базовому конструктору)
{

}


Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: констуктор

Сообщение IMB »

Действия которые надо провести в конструкторе я пишу в cpp, с этим вопросов нет.
HPP

Код: Выделить всё

    public:
        Capture(enum format_t format, unsigned int width, unsigned int height):
            Thread();

CPP

Код: Выделить всё

Capture::Capture(enum format_t format, unsigned int width, unsigned int height):
    Thread()
{
    work_param.format = format;
    work_param.width  = width;
    work_param.height = height;
    work_param.cAttrs = Capture_Attrs_DM6446_DM355_DEFAULT;
}

Ну и при компиляции я получаю:

Код: Выделить всё

capture.hpp: In constructor ‘Capture::Capture(format_t, unsigned int, unsigned int)’:
capture.hpp:29: error: expected `{' at end of input

Собствено вопрос в том - допустает ли конструктор вида Class1():BaseClass() передачу параметров или нет, если допускает, то где я ошибся?
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: C++: констуктор

Сообщение Voral »

Это единственная ошибка , которую выдает компилятор?
Можете привести файл capture.cpp полностью (или хотябы с начала и заканчивая этим конструктором)
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: констуктор

Сообщение NickLion »

IMB писал(а):
09.03.2010 13:54
HPP

Код: Выделить всё

    public:
        Capture(enum format_t format, unsigned int width, unsigned int height):
            Thread();

CPP

Код: Выделить всё

Capture::Capture(enum format_t format, unsigned int width, unsigned int height):
    Thread()
{
    work_param.format = format;
    work_param.width  = width;
    work_param.height = height;
    work_param.cAttrs = Capture_Attrs_DM6446_DM355_DEFAULT;
}

А надо:
HPP

Код: Выделить всё

    public:
        Capture(enum format_t format, unsigned int width, unsigned int height);

CPP

Код: Выделить всё

Capture::Capture(enum format_t format, unsigned int width, unsigned int height):
    Thread()
{
    work_param.format = format;
    work_param.width  = width;
    work_param.height = height;
    work_param.cAttrs = Capture_Attrs_DM6446_DM355_DEFAULT;
}

Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: констуктор

Сообщение IMB »

Тут возникла следующая проблема связанная с предыдущей.
thread.hpp

Код: Выделить всё

#include <pthread.h>
class Thread {
    public:
        Thread();
        ~Thread();
    protected:
        int start(pthread_t *thread, pthread_attr_t *attr,
                  void* (*func)(void*), void* arg);
        int stop(pthread_t thread, void *ret);
};

capture.hpp

Код: Выделить всё

#include "thread.hpp"
class Capture : protected Thread {
    public:
        Capture(enum format_t format, unsigned int width, unsigned int height);
        ~Capture();

capture.cpp

Код: Выделить всё

#include "capture.hpp"
Capture::Capture(enum format_t format, unsigned int width, unsigned int height):
    Thread()
{
    work_param.format = format;
    work_param.width  = width;
    work_param.height = height;
    work_param.cAttrs = Capture_Attrs_DM6446_DM355_DEFAULT;
}

При компиляции:

Код: Выделить всё

capture.o: In function `Capture':
/home/kirill/IP355/source/camera/capture.cpp:8: undefined reference to `Thread::Thread()'
/home/kirill/IP355/source/camera/capture.cpp:8: undefined reference to `Thread::Thread()'
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: C++: констуктор

Сообщение watashiwa_daredeska »

Как компилируете?
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: констуктор

Сообщение IMB »

Стандартный make.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: C++: констуктор

Сообщение watashiwa_daredeska »

Makefile покажите.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: констуктор

Сообщение NickLion »

А где реализация конструктора Thread? Что-то вроде thread.cpp должно быть :)
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: C++: констуктор

Сообщение watashiwa_daredeska »

NickLion писал(а):
09.03.2010 21:12
А где реализация конструктора Thread?
Она может быть в thread.cpp. А может и не быть. Поэтому и прошу показать Makefile, уж больно сообщения похожи на сообщения линковщика, а не компилятора.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: констуктор

Сообщение IMB »

Проблему решил.
thread.hpp

Код: Выделить всё

class Thread {
        public:
                Thread(){};
                ~Thread(){};

Makefile

Код: Выделить всё

SOURCES = $(wildcard *.cpp)
HEADERS = $(wildcard *.hpp)

COMPILE = $(CC) -Wall -c -g
LINK = $(CC) -lpthread
OBJFILES = $(SOURCES:%.cpp=%.o)

.SILENT:

all: dm355

dm355: $(TARGET)

$(TARGET):      $(OBJFILES) $(XDC_LFILE)
        @echo Linking $@ from $^..
        $(LINK) -o bin/$@ $^

$(OBJFILES):    %.o: %.cpp $(HEADERS) $(XDC_CFLAGS)
        @echo Compiling $@ from $<..
        $(COMPILE) $(shell cat $(XDC_CFLAGS)) -o $@ $<

$(XDC_LFILE) $(XDC_CFLAGS): $(XDC_CFGFILE) //платформоспецифично
        @echo
        @echo ======== Building $(TARGET) ========
        @echo Configuring application using $<
        @echo
        XDCPATH="$(XDC_PATH)" $(XDC_ROOT)/xs xdc.tools.configuro -c $(MVTOOL) -o $(XDC_CFG) -t $(XDC_TARGET) -p $(XDC_PLATFORM) $(XDC_CFGFILE)

Спасибо сказали:
spielmann
Сообщения: 105
ОС: Linux

Re: C++: констуктор

Сообщение spielmann »

Вот это
undefined reference to `Thread::Thread()'


получается в результате этого
class Capture : protected Thread


а нужно
class Capture : public Thread


Секция protected родителя доступна потомкам.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: констуктор

Сообщение IMB »

spielmann писал(а):
11.03.2010 12:22
получается в результате этого
class Capture : protected Thread


а нужно
class Capture : public Thread


Секция protected родителя доступна потомкам.

Как мне кажется конструктор находится в public.
Спасибо сказали:
spielmann
Сообщения: 105
ОС: Linux

Re: C++: констуктор

Сообщение spielmann »

Да, недоглядел. Ошибка была на этапе линковки - отсутствовала функция.
Спасибо сказали: