Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有非特定元素大小和元素数的向量_C++_Visual C++_Vector_Properties_Propertygrid - Fatal编程技术网

C++ 具有非特定元素大小和元素数的向量

C++ 具有非特定元素大小和元素数的向量,c++,visual-c++,vector,properties,propertygrid,C++,Visual C++,Vector,Properties,Propertygrid,我想为某些类中的每个点定义一些任意属性,但之前没有定义属性的类型和数量。所以,我需要将它们存储在一个向量中,但我不知道如何定义向量,每个元素可以不是特定的大小,并且具有不同的字段数。课程安排如下: class UnstructuredMesh { std::vector<size_t> m_cellBegIndices; //!< Cell Beginning Indices std::vector<size_t> m_faceBegIn

我想为某些类中的每个点定义一些任意属性,但之前没有定义属性的类型和数量。所以,我需要将它们存储在一个向量中,但我不知道如何定义向量,每个元素可以不是特定的大小,并且具有不同的字段数。课程安排如下:

class UnstructuredMesh
{
std::vector<size_t>     m_cellBegIndices;       //!< Cell Beginning Indices
std::vector<size_t>     m_faceBegIndices;       //!< Face Beginning Indices
std::vector<OSG::Pnt3f> m_points;               //!< Points
std::vector<????, ????> m_pointProperties;      //!< Point Properties
};

有人能帮我解决这个问题吗?

好吧,考虑到我的评论,我想我会举一个我建议的例子。很难确切地知道您在做什么,但这假设您正在用某种需要执行不同操作的可执行组件填充向量

我看你已经解决了你的问题,但下面的内容可能会提供一个更容易理解的解决方案。显然,向量上的内存释放应该在实际应用程序中以更好的形式处理,并且不要忘记在现实生活中包含虚拟析构函数。但这是编译和运行的

#include "windows.h"
#include <tchar.h>
#include <vector>
#include <stdio.h>

class iface
{
public:
   virtual void execute() = 0;

};

class do_stuff_A : public iface
{
private:
   int A;
   int B;

public:
   do_stuff_A()
   {
      A = 1;
      B = 2;
   }

   void execute() override
   {
      printf("\nA is %d, B is %d", A, B);
   }
};

class do_stuff_B : public iface
{
private:
   double A;
   double B;
   double C;

public:
   do_stuff_B()
   {
      A = 1.1f;
      B = 2.2f;
      C = 3.2f;
   }

   void execute() override
   {
      printf("\nA is %f, B is %f, C is %f", A, B);
   }
};

int _tmain(int argc, _TCHAR* argv[])
{

   std::vector<iface*> my_vec;

   my_vec.push_back(new do_stuff_A());
   my_vec.push_back(new do_stuff_B());

   my_vec[0]->execute();
   my_vec[1]->execute();

   Sleep(3000);

   for (int i = 0; i < my_vec.size(); i++)
   {
      delete my_vec[i];
   }

   return 0;
}

使用例如or如何?@JoachimPileborg在我的问题中,我的意思是所有的向量元素都是相同的大小,但它们的大小之前没有确定,将在运行时确定,但我认为这一个用于它们的元素具有不同大小的向量。不是吗?在这种情况下,不可能使用std::vector,因为它在编译时需要包含的类型。您可以使用void*`和类型转换来实现,但它有一种糟糕的代码味道。另外,当你说大小是固定的,但在运行时,我猜你已经有了很多不同的结构,你只需要在程序运行时选择其中一个,这意味着你确实可以使用Boost或unions,或者,您可以使用std::string或std::vector或类似的方法来处理数据。在这一点上,您似乎需要定义一个可能的变体列表,然后设计一个好的接口/基类,该接口/基类可以扩展以满足所有可能的变体,尽管在实践中这是非常困难的。然后可以用指向基类类型项的指针填充向量。我想这就是你想做的对吗?小心破坏。@Ian是的!类似的东西。我只是想用一个浮点向量来解决这个问题。然后解析浮点数并根据属性的顺序填充变量。看起来很复杂,但它解决了我的问题。但是我必须为每个属性组合定义一个类,这在我的情况下是不可能的:除非你能为你想要添加到这个向量中的所有属性创建一个基类,并使属性本身成为类或结构。我看到过一个非常复杂的使用模板的实现,其中定义了从公共基类继承的数据类型,以便可以对它们执行公共操作。很多时候,我会选择更多的打字,使设计更明确,更不复杂,即使它创建了一个不那么优雅的应用程序。