Какова связь между несколькими заголовочными файлами и классами? - PullRequest
1 голос
/ 17 февраля 2012

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

Control.h

#pragma once
#ifndef CONTROL_H
#define CONTROL_H

class Control
{
    public:
        Control();
        ~Control();
    private:
    public:
};

#endif /*CONTROL_H*/

Control.cpp

#include "Control.h"
#include "Hello.h"

Hello helloObj;

Control::Control()
{
}

Control::~Control()
{
}

int main()
{
    int a = helloObj.HelloWorld();
    return 0;
}

Hello.h

#pragma once
#ifndef HELLO_H
#define HELLO_H

class Hello
{
    public:
        Hello();
        ~Hello();
    private:
    public:
         int HelloWorld(void);
};
#endif /*HELLO_H*/

Hello.cpp

#include "Hello.h"

Hello::Hello()
{
}

Hello::~Hello()
{
}

int HelloWorld()
{
    return 5;
}

Я пытаюсь скомпилировать control.cpp с g ++ на OSX 10.7 и получаю

Undefined symbols for architecture x86_64:
      "Hello::Hello()", referenced from:
              __static_initialization_and_destruction_0(int, int)in cccZHWtd.o
      "Hello::~Hello()", referenced from:
              ___tcf_1 in cccZHWtd.o
      "Hello::HelloWorld()", referenced from:
              _main in cccZHWtd.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

Это компилятор, мой код или мое представление о том, чтопродолжается?Разве я не создаю что-то правильно?

Буду признателен за любые ссылки, описывающие это более подробно.

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

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

Вы получаете следующие ошибки: Ошибки компоновки , а не ошибки компиляции.
Компоновщик не может найти определения упомянутых функций и, следовательно, сообщает об ошибках. Кажется, вы не включили файл Hello.cpp, содержащий определения функций, в ваш проект.

Убедитесь, что Hello.cpp включено в ваш проект и является частью вашего проекта или
Если вы используете командную строку для компиляции и компоновки, убедитесь, что вы указали Hello.cpp в именах файлов в командной строке.

0 голосов
/ 17 февраля 2012

Большая часть проблемы в том, что я не знаком с G ++ (спасибо Алс). Также было несколько проблем с синтаксисом (спасибо Brain).

Вот исправленный (слегка раздутый для обзора структуры) код и команда g ++

Control.h

#pragma once
#ifndef CONTROL_H
#define CONTROL_H

class CONTROL
{
    private:
       //nothing defined yet...
    public:
        Control(); //default constructor
        ~Control(); //default destructor
};
#endif /*CONTROL_H*/

Control.cpp

#include "Hello.h"
#include "Control.h"

Hello helloTest; //instantiates the Hello Object

Control::Control()
{
}

Control::~Control()
{
}

int main()
{
    helloTest.HelloWorld();
    return 0;
}

hello.h

#pragma once
#ifndef HELLO_H
#define HELLO_H

class Hello
{
    private:
        //nothing defined yet
    public:
        Hello(); //default constructor
        ~Hello(); //default destructor

        void HelloWorld();
};
#endif /*HELLO_H*/

hello.cpp

#include "Hello.h"
#include <iostream> //so we can use 'cout'

using namespace std;

Hello::Hello()
{
}

Hello::~Hello()
{
}

void Hello::HelloWorld()
{
    std::cout << "Hello lovelies!\n"; //The magic word.
}

Затем мы запускаем g ++ примерно так:

g ++ -o Здравствуйте ./Control.cpp ./Hello.cpp

g ++ [опция] [имя выходного файла] [входные файлы]

0 голосов
/ 17 февраля 2012

Прежде всего:

    public:
    Hello();
    ~Hello();
    private:
    public:

бессмысленно, класс по умолчанию является приватным, и нет необходимости делать это Публичный дважды, и я не знаю, можете ли вы сделать это, кроме того, если у вас нет частных участников, там не должно быть личного (не пытайтесь быть грубым, просто совет) :-))

Теперь, чтобы ответить на вопрос (с предположением ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я НЕ 100% СЕМЬЯ С GCC):

Это ошибка компоновщика, это может быть связано с тем, что компилятор не может найти определение HelloWorld (пустоты) ;. Позвольте мне объяснить:

В вашем заголовочном файле вы написали:

int HelloWorld(void);

Однако в вашем .cpp вы пишете:

int HelloWorld()
{
   return 5;
}

Функция (или в этом случае метод, потому что он внутри класса) аргументы должны быть одинаковыми в заголовке и источнике, вы не может даже изменить имена (или, по крайней мере, вы не можете с VC ++, который что я использую; У меня мало опыта с gcc), так что это может быть решаемо набрав

int HelloWorld(void)
{
   return 5;
}

Далее (ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ Я НЕ на 100% знаком с препроцессором):

Вы также используете тег #pragma pre-proccsor, я его не использую, но Я полагаю, это означает, что вы можете включить файл только один раз, и вы включили Hello.h и Control.h дважды, как я сказал, я не эксперт в препроцессоре, но вы прокомментировали

HELLO_H

и

CONTROL_H

...