Проблема, связывающая “статические” методы в C++

Если вы находитесь в Windows, используйте Sendkeys , и если в Linux попробуйте указать здесь для xsendkeys или pexpect.

6
задан Srikanth 22 September 2008 в 18:48
поделиться

5 ответов

Очевидно, что Вы происходите из среды Java, потому что Вы еще не схватили понятие заголовочных файлов. В Java процесс определения чего-то обычно находится в одной части. Вы объявляете и определяете одновременно. В C/C++ это - двухступенчатый процесс. Объявление чего-то говорит компилятору, что "что-то существует с этим типом, но я скажу Вам позже, как это на самом деле реализовано". Определение чего-то дает компилятору часть фактической реализации. Заголовочные файлы используются главным образом для объявлений, .cpp файлы для определений.

Заголовочные файлы там для описания "API" классов, но не их фактического кода. Возможно включать код в заголовок, это назвало встраивание заголовка. Вы встроили все в CppClass.cpp (не хороший, встраивающий заголовок должно быть исключение), и затем Вы объявляете свой класс в main.cpp СНОВА, который является двойным объявлением в C++. Встраивание в теле класса ведет для кодирования удвоения каждый раз, Вы используете метод (это только звучит безумным. Посмотрите раздел часто задаваемых вопросов C++ по встраиванию для деталей.)

Включая двойное объявление в Вашем коде дает Вам ошибку компилятора. Отъезд кода класса компилирует, но дает Вам ошибку компоновщика, потому что теперь у Вас только есть подобное заголовку объявление класса в main.cpp. Компоновщик не видит кода, который реализует Ваши методы класса, вот почему ошибки появляются. Отличающийся от Java, компоновщик C++ НЕ будет автоматически искать объектные файлы, которые он хочет использовать. Если Вы будете использовать класс XYZ и не дадите ему объектный код для XYZ, то он просто перестанет работать.

Взгляните на статью заголовочного файла Википедии, и Заголовочный файл Включают Шаблоны (ссылка также в нижней части статьи Wikipedia и содержит больше примеров),

Короче говоря:

Для каждого класса генерируйте NewClass.h и файл NewClass.cpp.

В файле NewClass.h запишите:

class NewClass {
public:
   NewClass();
   int methodA();
   int methodB();
}; <- don't forget the semicolon

В файле NewClass.cpp запишите:

#include "NewClass.h"

NewClass::NewClass() {
  // constructor goes here
}

int NewClass::methodA() {
  // methodA goes here
  return 0;
}

int NewClass::methodB() {
  // methodB goes here
  return 1;
}

В main.cpp запишите:

#include "NewClass.h"

int main() {
  NewClass nc;
  // do something with nc
}

Для соединения всего этого сделайте a

g ++-o NewClassExe NewClass.cpp main.cpp

(просто пример с gcc)

33
ответ дан 8 December 2019 в 02:09
поделиться

Я думаю, что Вы хотите сделать что-то как:

g ++-c CppClass.cpp g ++-c main.cpp g ++-o идут main.o CppClass.o

Это должно разрешить его.

2
ответ дан 8 December 2019 в 02:09
поделиться

Вы определяете класс дважды, который я вполне уверен, не работает.

Попробуйте что-то вроде этого:

Сначала заголовок файл CppClass.h:

// CppClass.h
using namespace std;

class CppClass
{
public:
    static void Start();
    static void Stop();
    static void Join();
private:
    void *run_thread(void *pthread_args);
    void display();
};

Затем файл CppClass.cpp, реализовывая его:

// CppClass.cpp
#include <iostream>
#include <pthread.h>
#include "CppClass.h"

using namespace std;

void CppClass::Start()
{
    /* method body goes here */
}
void CppClass::Stop()
{
    /* method body goes here */
}
void CppClass::Join()
{
    /* method body goes here */
}
void *CppClass::run_thread(void *pthread_args)
{
    /* method body goes here */
}
void CppClass::display() {
    /* method body goes here */
}

Затем Ваш основной файл:

// main.cpp
#include "CppClass.h"

int main()
{
    /* main method body here */
}

Я верю g ++, вызов был бы тем же.

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

Я надеюсь тот имевший смысл...

10
ответ дан 8 December 2019 в 02:09
поделиться

Верные взгляды как компоновщик не забирают Вас второй исходный файл.

0
ответ дан 8 December 2019 в 02:09
поделиться

сделайте.h файл с определением класса в нем, и затем #include что файл в Ваши 2 файла.

1
ответ дан 8 December 2019 в 02:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: