我是C ++的新手。我对这个问题迷失了方向(我已经检查并尝试过在Stack Overflow上遇到这个问题的其他解决方案,但是由于某些原因,我无法解决它)。我有以下文件-
stdafx.h
#ifndef STDAFX_H
#define STDAFX_
#endif /* STDAFX_H */
#pragma once
#include <iostream>
#include <cstdlib>
#include <cmath>
geometry.h
#ifndef GEOMETRY_H
#define GEOMETRY_H
#endif /* GEOMETRY_H */
#pragma once
double PI = 3.1415;
class Circle {
public:
double radius;
double area() const;
double circumference() const;
};
geometry.cpp
#include "geometry.h"
double Circle::area() const {
return PI*radius*radius;
}
double Circle::circumference() const {
return 2*PI*radius;
}
main.cpp
#include "stdafx.h"
#include "geometry.h"
using namespace std;
int main() {
Circle c;
c.radius = 2.0;
cout << c.area();
cout << c.circumference();
}
我得到的错误是-
> cd '/Users/arpanganguli/NetBeansProjects/Chapter8'
/usr/bin/make -f Makefile CONF=Debug
"/Library/Developer/CommandLineTools/usr/bin/make" -f nbproject/Makefile-
Debug.mk QMAKE= SUBPROJECTS= .build-conf
"/Library/Developer/CommandLineTools/usr/bin/make" -f nbproject/Makefile-
Debug.mk dist/Debug/GNU-MacOSX/chapter8
mkdir -p dist/Debug/GNU-MacOSX
g++ -o dist/Debug/GNU-MacOSX/chapter8 build/Debug/GNU-MacOSX/geometry.o
build/Debug/GNU-MacOSX/main.o
duplicate symbol _PI in:
build/Debug/GNU-MacOSX/geometry.o
build/Debug/GNU-MacOSX/main.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
make[2]: *** [dist/Debug/GNU-MacOSX/chapter8] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
我不明白我在做什么错?我在MacOS上使用Netbeans 10(如果此信息有帮助)。我认为该错误试图告诉我的是,我两次链接相同的文件,但是如果我不喜欢通过geometry.h来访问main.cpp和geometry.cpp,我将无法在main中调用该函数.cpp。有人可以帮忙吗?
答案 0 :(得分:1)
您不能多次定义一个变量。您将头文件包含在geometry.cpp和main.cpp中,这将导致对其进行两次定义。正如我在评论中提到的,您可以将定义移至“ geometry.cpp”文件。如果要在其他文件中使用它,请在geometry.h中将其声明为extern double PI;
,然后仍在geometry.cpp中对其进行定义。
geometry.h
#pragma once
// Tell the compiler "this var exists, but in another file"
extern double PI;
class Circle {
public:
double radius;
double area() const;
double circumference() const;
};
geometry.cpp
#include "geometry.h"
// It is defined here
double PI = 3.1415;
double Circle::area() const {
return PI*radius*radius;
}
double Circle::circumference() const {
return 2*PI*radius;
}
假设Pi的值永远不变,您也可以将其设为const变量。然后,您可以回到在“ geometry.h”中进行定义
const double PI = 3.1415;
或者,为了完全避免使用全局变量,请使其成为Circle
类的成员:
class Circle {
public:
const double PI = 3.1415;
double radius;
double area() const;
double circumference() const;
};
除了我在这里无法涵盖的内容之外,还有更多内容。这里列出了很多不错的C ++书籍:The Definitive C++ Book Guide and List