LINUX.ORG.RU

проблема с объявление константных функций в Си++


0

1

объявляю класс

class CDrawObject

{

public:

   CDrawObject(void);

   ~CDrawObject(void);

   int getPosX() const;
-----------------------------------------
в реализации


int CDrawObject::getPosX() const
{

return this->posX;

}
-----------------------------------------

в коде вызываю например
cRes = new char[4];
sprintf(cRes,«%d», (*iterator_selectedObject)->getPosX());
gtk_entry_set_text(pbEdX, cRes);
delete cRes;


и пишет везде ошибку

/home/igor/scada/ScadaGraphic.cpp:125: undefined reference to `CDrawObject::getPosX()'
ScadaGraphic.o: In function `motion_notify_event':
/home/igor/scada/ScadaGraphic.cpp:175: undefined reference to `CDrawObject::getPosX()'
/home/igor/scada/ScadaGraphic.cpp:185: undefined reference to `CDrawObject::getPosX()'

точно такой же код в Visual Studio отлично компилится



Последнее исправление: g-71 (всего исправлений: 1)

Makefile в студию

/me прозревает, что ты не линкуешься там должным образом со своими объектниками.

yoghurt ★★★★★
()
Ответ на: комментарий от g-71

> если убрать const всё отлично скомпилится без ошибок

У вас оно и так сейчас компилируется без ошибок. Ошибки возникают при линковке. Потому что один исходник вы перекомпилировали после правки заголовочника, а другой - нет. Пользуйтесь системами сборки с генерацией зависимостей между исходниками, например CMake.

Dendy ★★★★★
()
Ответ на: комментарий от g-71

Ошибка в скриптах сборки, я так понимаю у вас самописный Makefile. Да, можете просто удалить объектник. Но вы ведь не собираетесь чистить проект каждый раз перед сборкой, верно? Почитайте про 'gcc -M' или возьмите одну из готовых систем сборки, в которых всё это из коробки.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

вот makefile

CC=g++
LDLIBS=`pkg-config --libs gtk+-2.0`
CFLAGS=-Wall -g `pkg-config --cflags gtk+-2.0`

ScadaGraphic: ScadaGraphic.o DrawObject.o Rectangle.o Ellipse.o Markers.o Connection.o
   $(CC) $(LDLIBS) ScadaGraphic.o DrawObject.o Rectangle.o Ellipse.o Markers.o Connection.o -o ScadaGraphic

ScadaGraphic.o: ScadaGraphic.cpp
   $(CC) $(CFLAGS) -c ScadaGraphic.cpp

DrawObject.o: DrawObject.cpp DrawObject.h
   $(CC) $(CFLAGS) -c DrawObject.cpp

Rectangle.o: Rectangle.cpp Rectangle.h DrawObject.h
   $(CC) $(CFLAGS) -c Rectangle.cpp

Ellipse.o: Ellipse.cpp Ellipse.h DrawObject.h
   $(CC) $(CFLAGS) -c Ellipse.cpp

Markers.o: Markers.cpp Markers.h DrawObject.h
   $(CC) $(CFLAGS) -c Markers.cpp
   
Connection.o: Connection.cpp Connection.h DrawObject.h
   $(CC) $(CFLAGS) -c Connection.cpp   

clean:
   rm -f ScadaGraphic
   rm -f *.o

g-71
() автор топика
Ответ на: комментарий от g-71

Посмотрите содержимое файлов и убедитесь, что иерархия заголовочников включает весь список зависимостей, перечисленных в Makefile для каждого из объектников. Вообще самописные Makefile'ы слишком дружелюбны к ошибкам, переложите эту задачу на автоматизированную систему сборки. К примеру на CMake это было бы так:

find_package( GTK2 )
add_executable( ScadaGraphics
    ScadaGraphics.cpp
    DrawObject.cpp
    Rectangle.cpp
    Ellipse.cpp
    Markers.cpp
    Connection.cpp
)
target_link_libraries( ScadaGraphics ${GTK2_LIBRARIES} )
Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.