对象列表

时间:2015-09-28 06:51:48

标签: list object c++-cli

我是C ++的新手,这是我的第一个程序,因此可能有一些奇怪/奇怪的代码对C ++来说根本不是逻辑。

我正在使用Visual Studio 2015 C ++ / cli,我试图在另一个对象中获取对象列表。

LinePiece.h:

ref class LinePiece
{
    private:
    std::string* Type;
    int ElementNr;
    int Status;
    int X, Y, X2, Y2;
    int Diameter;
    std::string* Text;
    public:
    LinePiece();

    LinePiece(std::string* a_type, int a_ElementNr, int a_Status, int a_x, int a_y, int a_x2, int a_y2)
    {
        Type = a_type;
        ElementNr = a_ElementNr;
        Status = a_Status;
        X = a_x;
        Y = a_y;
        X2 = a_x2;
        Y2 = a_y2;
    }
};

element.h展开:

#include "LinePiece.h"
ref class Element
{
public:
    Element();

    //properties
    std::string* ON;                        //order nummer
    std::string* MO;                        //order merk
    std::string* SN;                        //element nummer
    std::string* RS;                        //element afwerking
    std::string* OW;                        //wapeningspatroon
    std::string* CN;                        //element calculation number
    int el_length;                          //element lengte
    int el_width;                           //element hoogte
    int el_beginX;                          //element beginpunt
    int el_concrete_height;                 //element hoogte beton
    int el_iso_height;                      //element isolatie hoogte
    std::string* el_weight;                 //element gewicht
    std::list<LinePiece^>* listLinePieces;  //lijst met contouren   
};

因此,当我尝试构建此代码时,它会出现以下错误:

&#39;&安培;&安培;&#39;不能在类型&#39; LinePiece ^&#39;

上使用此间接

如何解决此问题,以便获取包含LinePiece个对象的对象列表?

3 个答案:

答案 0 :(得分:1)

  std::list<LinePiece^>* listLinePieces;

当你在罗马时,像罗马人一样行事变得非常重要。您无法在非托管集合中存储托管对象引用。管理对象的存储由垃圾收集器处理,但它没有希望找回这些引用。它不知道有关std :: list内部结构的bean,因此无法可靠地找回托管对象引用。编译器必须抱怨它。

请改用List<LinePiece^>^。还有很多,很多比std :: list和cliext :: list更有效。

  std::string* el_weight;

对于所有这些std :: string指针来说,你可能已经发现了必须存储指针的硬方法。 C ++ / CLI编译器不允许将值存储在托管对象中,当垃圾收集器在压缩堆时移动对象时太危险。你必须编写一个非常丑陋的构造函数来分配它们。只要你实现了终结器(不要跳过!),现在就可以了。但是当你把它们变成String ^时,罗马的生活会轻松得多。所以垃圾收集器会处理它们。

答案 1 :(得分:0)

您还没有提到它,但您正在尝试使用某些特定的C ++ / CX功能,是否有意?如果是这样,我认为您还需要添加命名空间,否则请跳过ref^

完全理解你想要做什么的代码太少了,但是我跳过了所有字符串的指针,我不认为这是你想做的事情,但是因为我没有&# 39;我有其余的代码,我不能确定。另外,制作列表的指针可能也不是你想要的。

答案 2 :(得分:0)

库STL / CLR包含名称空间cliext而不是std。

#include <cliext\list>
...
cliext::list <LinePiece^> listLinePieces;

我建议放弃指向std :: string的指针,转而使用.Net中的System :: String ^。

修改

.Net还包括双向链表的实现。使用它:

#using <System.dll>
using namespace System::Collections::Generic;
...
LinkedList<LinePiece^> LinkedList;

详细了解MSDN