其他一切看起来都很好,但最后还是出现了链接错误:
1>Finished searching libraries
1>Finished pass 1
1>Generating non-SAFESEH image.
1>Invoking CVTRES.EXE:
1> /machine:x86
1> /verbose
1> /out:"C:\Users\ocuk\AppData\Local\Temp\lnk9464.tmp"
1> /readonly
1> ".\Debug\Virtual functions.exe.embed.manifest.res"
1>Microsoft (R) Windows Resource To Object Converter Version 9.00.21022.08
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>adding resource. type:MANIFEST, name:1, language:0x0409, flags:0x30, size:2048
1>fig10_10.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Circle::print(void)const " (?print@Circle@@UBEXXZ) referenced in function _main
1>fig10_10.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Point::print(void)const " (?print@Point@@UBEXXZ) referenced in function _main
1>C:\Users\ocuk\Documents\C++\Chapter 10\Virtual functions\Debug\Virtual functions.exe : fatal error LNK1120: 2 unresolved externals
1>Build log was saved at "file://c:\Users\ocuk\Documents\C++\Chapter 10\Virtual functions\Virtual functions\Debug\BuildLog.htm"
1>Virtual functions - 3 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========在添加VERBOSE之后,我得到一个新的错误:
1>------ Rebuild All started: Project: Virtual functions, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'Virtual functions', configuration 'Debug|Win32'
1>Compiling...
1>circle.cpp
1>fig10_10.cpp
1>point.cpp
1>Generating Code...
1>Compiling manifest to resources...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>Linking...
1>LINK : fatal error LNK1104: cannot open file 'VERBOSE.obj'
1>Build log was saved at "file://c:\Users\ocuk\Documents\C++\Chapter 10\Virtual functions\Virtual functions\Debug\BuildLog.htm"
1>Virtual functions - 1 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========当我尝试构建我的项目时,我得到了以下错误。发生的情况是,我已经编写了新的头文件(除了now virtual中的一个函数之外,它们与旧的头文件相同。根据我正在工作的文本,没有必要修改相应的.cpp文件,所以我只是从上一个项目中复制了它们,方法是单击源文件并选择add existing。然后我转到项目属性/“C/C++”/General并添加了.cpp文件所在的路径,但是我仍然得到显示的链接错误:

1>------ Build started: Project: Virtual functions, Configuration: Debug Win32 ------ 1>Compiling... 1>circle.cpp 1>point.cpp 1>fig10\_10.cpp 1>Generating Code... 1>Linking... 1>fig10\_10.obj : error LNK2019: unresolved external symbol "public: virtual void \_\_thiscall Circle::print(void)const " (?print@Circle@@UBEXXZ) referenced in function \_main 1>fig10\_10.obj : error LNK2019: unresolved external symbol "public: virtual void \_\_thiscall Point::print(void)const " (?print@Point@@UBEXXZ) referenced in function \_main 1>C:\Users\ocuk\Documents\C++\Chapter 10\Virtual functions\Debug\Virtual functions.exe : fatal error LNK1120: 2 unresolved externals 1>Build log was saved at "file://c:\Users\ocuk\Documents\C++\Chapter 10\Virtual functions\Virtual functions\Debug\BuildLog.htm" 1>Virtual functions - 3 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========//Fig 10.9:circle.h
//Circle class contains x-y coordinate pair and radius
#ifndef CIRCLE_H
#define CIRCLE_H
#include "point.h" //Point class definition
class Circle: public Point{
public:
//default constructor
Circle(int=0, int=0, double=0.0);
void setRadius( double); //set radius
double getRadius() const; //return radius
double getDiameter() const; //return diameter
double getCircumfernce() const; //return circumfernce
double getArea() const; //return area
virtual void print() const; //output Circle object
private:
double radius; //Circle's radius
};
#endif
//Fig. 10.8:point.h
//Point class definition represents an x-y coordinate pair
#ifndef POINT_H
#define POINT_H
class Point{
public:
Point(int=0, int=0); //default constructor
void setX(int); //setX in coordinate pair
int getX() const; //return x in coordinate pair
void setY(int); //set y in coordinate pair
int getY() const; //return y from coordinate pair
virtual void print() const; //output Point object
private:
int x; //x part of coordinate pair
int y; //y part of coordinate pair
};
#endif
//Fig 10.4: circle.cpp
// Circle class member-function definitions
#include <iostream>
using std::cout;
#include "circle.h" //Cicle class definition
//default constructor
Circle::Circle(int xValue, int yValue, double radiusValue):Point (xValue, yValue)//call base class constructor
{
setRadius(radiusValue);
}//end circle constructor
//set Radius
void Circle::setRadius(double radiusValue)
{
radius=(radiusValue<0.0?0.0:radiusValue);
}//end fuinction setRadius
//return radius
double Circle::getRadius() const
{
return radius;
}//end finction getRadius
//calculate and return diameter
double Circle::getDiameter() const
{
return 2*getRadius();
}
//calculate and return diameter
double Circle::getCircumference() const
{
return 3.14159*getDiameter();
}
//calculate and return area
double Circle::getArea() const
{
return 3.14159*getRadius()*getRadius();
}//end function getArea
//output Circle object
void Circle::print() const
{
cout << "center = ";
Point::print(); //invoke Point's print function
cout << "; radius = " << getRadius();
}//end function print
//Fig. 10.2:point.cpp
//Point class member function definitions
#include <iostream>
using std::cout;
#include "point.h" //Point clss deinition
//default constructor
Point::Point(int xValue, int yValue):x(xValue),y(yValue)
{
//empty body
}
//set x in coordinate pair
void Point::setX( int xValue)
{
x=xValue; //no need for validation
}//end function setX
//return x from coordinate pair
int Point::getX() const
{
return x;
}//end function getX
//set y in coordinate pair
void Point::setY( int yValue)
{
y=yValue; //no need for validation
}//end function setY
//return y from coordinate pair
int Point::getY() const
{
return y;
}//end function getY
//output Point object
void Point::print() const
{
cout << '[' << getX() << ", " << getY() << ']';
} //end function print
//Fig. 10.10: fig10_10.cpp
//Introducing polymorphism, virtual functions and dynamic binding
#include <iostream>
using std::cout;
using std::endl;
using std::fixed;
#include <iomanip>
using std::setprecision;
#include "point.h" //Point class definition
#include "circle.h" //Circle class definition
int main()
{
Point point(30,50);
Point *pointPtr=0;
Circle circle(120,89,2.7);
Circle *circlePtr=0;
//set floating point precision
cout << fixed <<setprecision(2);
//output objects point and circle using static binding
cout << "Invoking print function on point and circle "
<< "an objects with static binding "
<< "ananPoint: ";
point.print(); //static binding
cout << "anCircle: ";
circle.print(); //static binding
//output pbjects print and cicrle using dynamic binding
cout << "\n\nInvoking print function on point and circle "
<< "\nobjects with dynamic binding";
//aim base-class pointer at base-class object and print
pointPtr=&point;
cout << "\n\nCalling virtual function print with base-class"
<< "\npointer to a base-class object"
<<"\ninvokes base-class print function:\n";
pointPtr->print();
//aim derived calss pointer at derived class
//object and print
circlePtr=&circle;
cout << "\n\nCalling virtual function print with "
<<"\nderived-class pointer to derived class object "
<<"\ninvokes derived class print function:\n";
circlePtr->print();
//aim-base calss pointer at derive class object and print
pointPtr=&circle;
cout << "\n\nCalling virtual function print with base-class"
<< "\npointer to derived class object "
<<"\ninvokes derived class print function:\n";
pointPtr->print(); //polymorphiosm invokes ciecle's print
cout << endl;
return 0;
}发布于 2014-01-12 02:40:44
井,
Circle::print(void)
Point::print(void)不会被链接器发现。这意味着要么
这些都是虚函数,请确保它们是在您的类中的某个位置实现的(如果您想要多态性,则必须在派生类中覆盖它们)。一个纯虚函数可以在最后用“=0”声明,但在这种情况下,你必须在一个派生类中手动实现它。
代码后更新:
你的代码在我看来没问题,只有一个语法错误:
double getCircumfernce() const; //return circumfernce这阻止了编译。请务必将其更正。
还有:只是为了确认一下..您是否将每段代码放入一个单独的文件中,不是吗?如果您将整个代码放入一个.cpp文件中,您将获得
1>------ Build started: Project: ConsoleApplication2, Configuration: Debug Win32 ------
1> ConsoleApplication2.cpp
1>ConsoleApplication2.obj : error LNK2005: "public: __thiscall Circle::Circle(int,int,double)" (??0Circle@@QAE@HHN@Z) already defined in circle.obj
1>ConsoleApplication2.obj : error LNK2005: "public: __thiscall Point::Point(int,int)" (??0Point@@QAE@HH@Z) already defined in point.obj还有很多其他的链接错误..
其他更开放的问题:
发布于 2014-01-12 02:51:21
我能猜出有两个原因。
1)在旧版本中,你的程序函数print只在基类中定义。现在,您将此函数添加到派生类Point和Circle中。但是您忘记了在cpp模块中定义它们。对于这些类
2)也许您为这些函数添加了限定符const,而旧函数没有限定符const。您又一次忘记了更改cpp模块中函数的定义。
https://stackoverflow.com/questions/21066308
复制相似问题