从文件中读取对象时未定义的符号

时间:2014-06-10 16:52:55

标签: c++

我的作业有问题。我试图从一个文件中读取每个写入的行对应一个对象(ShapePtr),我应该从每一行初始化一个对象并将它们存储在一个列表中。所有ShapePtr都有一个指向形状的指针。

这是抱怨主要方法的存根:

ifstream is("test.dat");
istream_iterator<ShapePtr> shapein(is), endofshapein;
list<ShapePtr> shapelist(shapein, endofshapein);

for (list<ShapePtr>::iterator it = shapelist.begin(); it != shapelist.end(); ++it)
     cout << *it << endl;

ShapePtr的定义:

class ShapePtr
{
    private:
        Shape *shape;
    public:
        ShapePtr() { shape = 0; }
        ShapePtr(const ShapePtr& shptr);
        ShapePtr& operator=(const ShapePtr& shptr);
        ShapePtr(Shape *ptr) { shape = ptr; }
        ~ShapePtr() { delete shape; }
        ShapePtr* clone() const;
        friend ostream& operator<<(ostream& out, const ShapePtr& sh);
        friend istream& operator>>(istream& in, ShapePtr& sh);
};

inline ostream& operator<<(ostream& out, const ShapePtr& sh)
{
    sh.shape->print(out);
    return out;
}

inline istream& operator>>(istream& in, ShapePtr& sh)
{
    string name, data;
    in >> name;
    getline(in, data);
    cout << name << '\n';
    cout << data << endl;
    //sh.shape->read(in);   // Not currently implemented
    sh = ShapePtr(new Point(1.0, 2.0, 3.0)); // Just for testing 
    return in;
}

ShapePtr的实现:

ShapePtr::ShapePtr(const ShapePtr& shptr)
{
    if(shptr.shape)
        shape = shptr.shape->clone();
    else
        shape = 0;
}

ShapePtr& ShapePtr::operator=(const ShapePtr& shptr)
{
    if(shptr.shape)
        shape = shptr.shape->clone();
    else
        shape = 0;
    return *this;
}

ShapePtr *ShapePtr::clone() const
{
   return new ShapePtr(*this);
}

我目前正在尝试查看从文件中读取的内容,以便继续实现形状的初始化。但是现在我尝试运行时出现以下错误:

Undefined symbols for architecture x86_64:
"ShapePtr::ShapePtr(ShapePtr const&)", referenced from:
std::__1::list<ShapePtr, std::__1::allocator<ShapePtr> >::push_back(ShapePtr const&) in main-1a9984.o 
std::__1::istream_iterator<ShapePtr, char, std::__1::char_traits<char>, long>::istream_iterator(std::__1::istream_iterator<ShapePtr, char, std::__1::char_traits<char>, long> const&) in main-1a9984.o "operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, ShapePtr const&)", referenced from:
_main in main-1a9984.o "operator>>(std::__1::basic_istream<char, std::__1::char_traits<char> >&, ShapePtr&)", referenced from:
_main in main-1a9984.o std::__1::list<ShapePtr, std::__1::allocator<ShapePtr> >::list<std::__1::istream_iterator<ShapePtr, char, std::__1::char_traits<char>, long> >(std::__1::istream_iterator<ShapePtr, char, std::__1::char_traits<char>, long>, std::__1::istream_iterator<ShapePtr, char, std::__1::char_traits<char>, long>, std::__1::enable_if<__is_input_iterator<std::__1::istream_iterator<ShapePtr, char, std::__1::char_traits<char>, long> >::value, void>::type*) in main-1a9984.o
ld: symbol(s) not found for architecture x86_64

我做错了什么?我试图自己解决这个问题,但我无处可去。感谢

修改

我的问题是:在编译命令中不包括文件shapeptr.cpp。

1 个答案:

答案 0 :(得分:2)

您声明了ShapePtr的复制构造函数但未实现它。要么实现它,要么删除原型以使用默认原型。

由于您定义了ShapePtr::~ShapePtr(),因此应与ShapePtr::operator=()一起实施以获得预期的行为。