我已经多次看到这个问题,但是基本答案似乎是头文件的多次包含。就我而言,这不是问题,我也不知道是什么。
我有一个基本的c ++文件,看起来在这里可以正常工作:
// Filename : t1.cpp
#include <stdio.h>
struct T1{
int result;
T1(int var1, int var2) {
result = var1 * var2;
}
};
void main(void){
T1 t(2, 3);
printf("%d\n", t.result);
}
编译并运行后,将生成答案6。大。现在,当我将此代码分为两个文件(.cpp和.h)时,出现错误(错误C2011:'T1':'struct'类型重新定义)。这是这两个不同的文件的样子:
//Filename : test1.h
#ifndef TEST_H
#define TEST_H
struct T1{
int result;
T1(int var1, int var2);
};
#endif
//Filename : test1.cpp
#include "test1.h"
struct T1{
int result;
T1(int var1, int var2) {
result = var1 * var2;
}
};
我曾经尝试使用#pragma,以及使用class而不是struct,但这没关系。这根本是错误的。我不明白为什么它可以在独立文件中使用,但是当分为标头和实现版本时却不能。我需要对头文件和实现文件做什么?
答案 0 :(得分:6)
编写struct T1 { /* ... */ };
时,您正在定义结构T1
。通常在结构中,每个结构单元只能定义一次结构,方法是将定义放入头文件中,并将该头文件包含在需要定义的每个结构单元中。由于test1.cpp
包含test1.h
,因此它不应尝试再次定义T1
。
相反,test1.cpp
需要定义函数 T1::T1
,该函数是在T1
中的test1.h
的定义中声明的,但没有定义尚未定义。要在声明成员函数的类定义之外定义成员函数,我们使用以下语法:
T1::T1(int var1, int var2) {
result = var1 * var2;
}
答案 1 :(得分:0)
谢谢你,布莱恩。非常简单,但从根本上有效。
结果头文件:
//Filename : test1.h
#pragma once
typedef struct T1{
int result;
T1(int var1, int var2);
}T1;
生成的实现文件:
//Filename : test1.cpp
#include "test1.h"
T1::T1(int var1, int var2) {
result = var1 * var2;
}
生成的驱动程序文件:
//Filename drvr.cpp
#include <stdio.h>
#include "test1.h"
void main(void) {
T1 t(2,3);
printf("%d\n", t.result);
}
感谢大家对此进行讨论并发布解决方案。