C++ 如何定义编译时数据未知的常量数组

C++ 如何定义编译时数据未知的常量数组,c++,arrays,C++,Arrays,我想在类中存储网格的顶点数据。 每个实例都有一个浮点数组,可以通过返回数组指针的getter进行访问。 数组的数据和数组本身都应该是常量。 所以我的第一个想法是这样宣布成员: const float * const m_vertices; // const pointer to const floats 问题是编译时不知道实际数据(从文件加载,程序生成…) 是否有一种方法可以确保数据在初始化时(例如在构造函数中)不会被触及 编辑: 我尝试了约瑟夫的建议: //网格类 网格::网格(常量浮点*

我想在类中存储网格的顶点数据。 每个实例都有一个浮点数组,可以通过返回数组指针的getter进行访问。 数组的数据和数组本身都应该是常量。 所以我的第一个想法是这样宣布成员:

const float * const m_vertices;  // const pointer to const floats
问题是编译时不知道实际数据(从文件加载,程序生成…)

是否有一种方法可以确保数据在初始化时(例如在构造函数中)不会被触及

编辑: 我尝试了约瑟夫的建议:

//网格类
网格::网格(常量浮点*顶点)
:m_顶点(顶点)
{
}
//创建数据
int size=10//这不能是常量,因为编译时顶点的数量未知
浮动arr[大小]//错误:“大小”不是常量
对于(int i=0;i<10;i++){
arr[i]=i;
}
网格m=网格(arr)//这显然有效。。。但是构造函数需要一个常量float*。这里我给你一个浮动*。为什么会这样?

您可以使用所需的确切类型。允许构造函数将数据写入
const
字段:

class Foo {
  public:
    const float *const m_vertices;
    Foo(const float *vertices) : m_vertices(vertices) {}
};

尽管这里不能保证调用方没有非
常量
指针。如果要防止这种情况发生,则需要复制数据,而不仅仅是使用指针。

您可以使用所需的确切类型。允许构造函数将数据写入
const
字段:

class Foo {
  public:
    const float *const m_vertices;
    Foo(const float *vertices) : m_vertices(vertices) {}
};
Mesh::Mesh(const float *vertices): m_vertices(vertices)
{
}

float number = 3.141;  // e.g.
int size = 10;
const float *vertices = &number;  // e.g.

vertices_ptr = new float[ size ];


meshPtr = new Mesh( vertices_ptr);
尽管这里不能保证调用方没有非
常量
指针。如果您想防止这种情况,那么您需要复制数据,而不仅仅是使用指针

Mesh::Mesh(const float *vertices): m_vertices(vertices)
{
}

float number = 3.141;  // e.g.
int size = 10;
const float *vertices = &number;  // e.g.

vertices_ptr = new float[ size ];


meshPtr = new Mesh( vertices_ptr);
通过
meshPtr->…


通过
meshPtr->…

访问它,使“getter”成为类的
const
成员,使实际指针或数组成为可在运行时初始化的私有成员(例如,在类的构造函数中)。确保不提供任何其他提供数据访问的非
const
函数。此外,您可能不需要存储元素数量并访问该数量的方法。这是我想到的替代方法。但是没有什么可以阻止修改数据,因为getter将返回一个float*而不是const float*,然后返回一个
const float*
。这会阻止更改数据。编辑:Ok nevermind,您可以返回常量浮点*即使基础数据不是常量?我很难理解const关键字是如何工作的。
const float*
有效地告诉编译器,指向的
float
(或
float
s)不应该修改。
float*
告诉编译器允许修改
float
数据。现在,采用一个
float*
并添加一个“不得修改”的但书并没有什么害处,所以没有必要阻止它。相反(删除
const
)允许修改不应修改的内容(即停止编译器将尝试诊断为错误)。使“getter”成为类的
const
成员,使实际指针或数组成为可在运行时初始化的私有成员(例如,在类的构造函数中)。请确保不提供任何其他提供对数据访问的非const函数。此外,您可能不需要存储元素数并访问该数的方法。这是我想到的替代方法。但没有任何东西阻止修改数据,因为getter将返回浮点*而不是常量浮点*值n返回一个
const float*
。这会阻止更改数据。编辑:Ok nevermind,您可以返回一个const float*,即使基础数据不是const?我很难理解const关键字是如何工作的。tbhA
const float*
有效地告诉编译器,指针指向
float
(或
float
s)不应该被修改。一个
float*
告诉编译器允许修改
float
数据。现在,使用
float*
并添加一个“shall not modify”的但书并没有什么害处,所以没有必要阻止它。换一种方式(删除
const
)允许修改不应修改的内容(即停止编译器将尝试诊断为错误)。这只是延迟问题。正如我所说,实际数据在编译时是未知的。我无法在运行时创建构造函数参数。是的,你可以。为什么你不能?你能编辑你的问题以显示你试图这样做但不起作用的代码吗?这只是延迟问题。正如我所说,实际数据在co中是未知的mpile time。我无法在运行时创建构造函数参数。是的,您可以。为什么您不能?您可以编辑您的问题以显示您尝试执行但不起作用的代码吗?此处可能不需要
new
。正确设置范围,并且
std::vector
将完成此任务。此处可能不需要
new
。设置sc正确操作,并且
std::vector
将完成此工作。