使用另一个cpp文件的功能

时间:2014-12-09 14:23:05

标签: c++

我有一个main.cpp文件,其中包含以下内容:

#include<iostream>
using namespace std;

#include"Command.cpp"

#define EXIT 5

int main(){
    int code;
    do{
        code = getCommand();
        doCommand(code);
    }while(code != EXIT);
}

在我的Command.cpp文件中,我有一些功能:

#include<iostream>
using namespace std;

#include"Service.h"

Service * first = new Service();

int getCommand(){
    cout<<"Choose one of the following commands: "<<endl;
    cout<<"1. Add new service"<<endl;
    cout<<"2. Add new subservice"<<endl;
    cout<<"3. Add parent to a service"<<endl;
    cout<<"4. Delete a service(and it's subservices)"<<endl;
    cout<<"Your Choice: ";
    int c;
    cin>>c;
    return c;
}
void addService(){
    first->add();
}

void addSubService(){
    cout<<"Let's choose the parent first: "<<endl;
    int * one = new int;
    *one = 1;
    first->print(one,0);
    cout<<"0. here."<<endl<<"> ";
    int id;
    cin>>id;
    Service * f = first->find(one,id);

}

void addParentToService(){

}

void doCommand(int c){
    switch(c){
    case 1:
        addService();
        break;
    case 2:
        addSubService();
        break;
    case 3:
        addParentToService();
        break;
    case 4:
        //deleteService();
        break;
    }
}

但是当我点击Visual Studio中的编译按钮时,我收到以下错误:

1>Command.obj : error LNK2005: "void __cdecl addParentToService(void)" (?addParentToService@@YAXXZ) already defined in Source.obj
1>Command.obj : error LNK2005: "void __cdecl addService(void)" (?addService@@YAXXZ) already defined in Source.obj
1>Command.obj : error LNK2005: "void __cdecl addSubService(void)" (?addSubService@@YAXXZ) already defined in Source.obj
...

我认为问题在于链接这些文件,但我不知道该怎么办......

2 个答案:

答案 0 :(得分:1)

您永远不应该将cpp文件包含在其他cpp文件中。这是使用.h文件的地方。你可以参考这个关于如何做到这一点的问题:

Using multiple .cpp files in c++ program?

基本上,您遇到的问题是您多次包含Command.cpp文件。预处理器获取文件的内容,并直接将其复制到包含在其中的文件中,这意味着如果不保护文件不被重新包含,您最终可能会对同一对象有多个定义。 (这也是警卫发挥作用的地方)。

这是一个要涵盖的整体大型主题,有很多资源可以讨论这个问题。

答案 1 :(得分:0)

如果要将功能链接到不同的文件,则永远不会在另一个.cpp文件中包含.cpp个文件。您只需包含.hh个文件,您可以在其中定义任何其他函数,这些函数在其他.cpp文件中实现。

示例:main.cpp

#include "42.hh"
#include <iostream>

int main() {
  func42();
  return 0;
}

包含文件:42.hh

#ifndef _42_HH_
#define _42_HH_
void func42();
#endif

功能文件:42.cpp

#include <iostream>

void func42() {
  std::cout << "Fourty-two" << std::endl;
}

编译并运行:

~$ g++ 42.cpp main.cpp -o fourty-two
~$ ./fourty-two 
Fourty-two