C++ 简单变体增强

Posted

技术标签:

【中文标题】C++ 简单变体增强【英文标题】:C++ Simple Variant Boost 【发布时间】:2011-01-16 20:32:48 【问题描述】:

我正在尝试使用变体 boost 创建一个对象列表。

#include <string>
#include <list>
#include <iostream>
#include <boost/variant.hpp>

using namespace std;
using namespace boost;   

class CSquare;

class CRectangle 
public:
  CRectangle();
;

class CSquare 
public:
  CSquare();
;

int main()
   typedef variant<CRectangle,CSquare, bool, int, string> object;

    list<object> List;

    List.push_back("Hello World!");
    List.push_back(7);
    List.push_back(true);
    List.push_back(new CSquare());
    List.push_back(new CRectangle ());

    cout << "List Size is: " << List.size() << endl;

    return 0;

不幸的是,产生了以下错误:

/tmp/ccxKh9lz.o: In function `main':
testing.C:(.text+0x170): undefined reference to `CSquare::CSquare()'
testing.C:(.text+0x203): undefined reference to `CRectangle::CRectangle()'
collect2: ld returned 1 exit status

我意识到如果我使用表格一切都会好起来的:

CSquare x;
CRectangle y;
List.push_back("Hello World!");
List.push_back(7);
List.push_back(true);
List.push_back(x);
List.push_back(y);

但我想尽可能避免这种形式,因为我想保持我的对象不命名。这是我的系统的重要要求 - 有什么方法可以避免使用命名对象?

【问题讨论】:

【参考方案1】:

只需要改变一些东西就可以了:

#include <iostream>
#include <list>
#include <string>
#include <boost/variant.hpp>
using namespace std;
using namespace boost;   

class CRectangle

public:
 CRectangle() 
;

class CSquare

public:
 CSquare() 
;

int main()

 typedef variant<CRectangle, CSquare, bool, int, string> object;
 list<object> List;
 List.push_back(string("Hello World!"));
 List.push_back(7);
 List.push_back(true);
 List.push_back(CSquare());
 List.push_back(CRectangle());

 cout << "List Size is: " << List.size() << endl;

 return 0;

具体来说,您需要定义 CRectangle 和 CSquare 构造函数(这就是您收到链接器错误的原因)并使用 CSquare() 而不是 new CSquare() 等。此外,"Hello World!" 的类型为 const char *,所以您将string("Hello World!") 传递给push_back 时需要写,否则它会在此处隐式转换为bool(不是您想要的)。

【讨论】:

【参考方案2】:

而不是 List.push_back(new CSquare());随便写

List.push_back(CSquare());

还要写下你的构造函数的定义

【讨论】:

【参考方案3】:

您忘记实现构造函数CRectangle::CRectangle()CSquare::CSquare()

要么在类之外的某个地方实现它们,例如:

CRectangle::CRectangle()
 
    // :::
; 

...或在类中实现它们:

class CRectangle 
public:
  CRectangle()
   
    // :::
  
; 

...或完全删除构造函数声明:

class CRectangle 
public:
; 

【讨论】:

以上是关于C++ 简单变体增强的主要内容,如果未能解决你的问题,请参考以下文章

go语言简单介绍,增强了解

C++基础1 C与C++的功能扩展语法增强   namesapce const 引用

OpenCV C++(四)----对比度增强

C++笔记--语法增强(1-2)

c++中的登录程序密码屏蔽增强

如何在 C++ 中运行异步增强功能?