我如何制作一个数组,它是一个 class 对象并具有编译时大小?
How do i make an array which is a class object and has a compile time size?
我是这方面的新手,并没有做太多,但我真的坚持制作一个编译时大小的数组,这是一个 class 对象。也许有一种方法可以保存文件中的所有信息,同时占用更少的内存?这是我的一些代码:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Beer
{
public:
string name;
string rating;
string country;
string alc;
string type;
};
int main() //Function uses ''bytes of stack/exceeds analyze:stacksize '16384'.
//Consider moving some data to heap
{
ifstream file("beer.txt");
if (!file.good())
{
cout << "Error. File was not found." << endl;
exit(EXIT_FAILURE);
}
else
{
int count;
string line;
ifstream file("beer.txt");
int count = 0;
for (int i = 0; !file.eof(); i++)
{
getline(file, line);
count++;
}
const int SIZE = count; //<- this is the place i'm struggling with
Beer allBeers[SIZE]; //expression must have a constant value
Beer currentBeer;
for (int i = 0; !file.eof(); i++)
{
getline(file, currentBeer.name, '\t');
getline(file, currentBeer.rating, '\t');
getline(file, currentBeer.country, '\t');
getline(file, currentBeer.alc, '\t');
getline(file, currentBeer.type, '\n');
allBeers[i] = currentBeer;
}
}
file.close();
return 0;
}
如果您在编译时不知道大小,那么您应该使用 std::vector
代替。
https://en.cppreference.com/w/cpp/container/vector
#include <vector>
然后
std::vector<Beer> allBeers;
稍后,添加啤酒:
allBeers.push_back(currentBeer);
如果在编译期间不知道数组的大小,只需使用 std::vector
:
#include <vector>
// ...
// const int SIZE = count; // you don't need this anymore
std::vector<Beer> allBeers;
// ...
allBeers.push_back(currentBeer); // to append it to your 'array'
vector
s 的行为与数组非常相似,但是当使用 push_back
时,它们 'grow' 如果需要的话。请注意,它们可能会保留比必要的多一点的内存,这样它们就不必在您每次调用 push_back
时都增长。要释放此保留内存,您可以在之后调用 shrink_to_fit
一次。
如果您不想使用 shrink_to_fit
,您也可以预先使用
将 vector
精确设置为您需要的尺寸
const int SIZE = count;
std::vector<Beer> allBeers;
allBeers.reserve(SIZE);
您的代码的 main 问题在以下两行中:
const int SIZE = count; //<- this is the place i'm struggling with
Beer allBeers[SIZE]; //expression must have a constant value
现在,虽然 SIZE
被定义为 const
但它是 而不是 和 编译时 常量!此外,C++
中的数组需要 编译时 常量的维度。 (您的 const
限定符仅意味着,一旦初始化,SIZE
的值就无法更改。)
解决此问题的简单 "old-style-C++" 方法是将 allBeers
声明为 指针 并使用 new
运算符创建运行 时的 'array buffer'(当 SIZE
的 实际 值已知时):
const int SIZE = count; // Don't really need this, now - could just use "count"
Beer* allBeers = new Beer[SIZE]; // You can still use allBeers[i] to access!
但是,在这里,您应该确保在完成 array/buffer 后执行 delete[] allBeers;
。
一种更现代的方法是使用 std::vector
类型,在这种情况下,当对象超出范围时,释放内存会自行解决:
const size_t SIZE = size_t(count);
std::vector<Beer> allBeers(SIZE);
同样,您可以使用 allBeers[i]
.
访问
随时要求进一步澄清and/or解释。
我是这方面的新手,并没有做太多,但我真的坚持制作一个编译时大小的数组,这是一个 class 对象。也许有一种方法可以保存文件中的所有信息,同时占用更少的内存?这是我的一些代码:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Beer
{
public:
string name;
string rating;
string country;
string alc;
string type;
};
int main() //Function uses ''bytes of stack/exceeds analyze:stacksize '16384'.
//Consider moving some data to heap
{
ifstream file("beer.txt");
if (!file.good())
{
cout << "Error. File was not found." << endl;
exit(EXIT_FAILURE);
}
else
{
int count;
string line;
ifstream file("beer.txt");
int count = 0;
for (int i = 0; !file.eof(); i++)
{
getline(file, line);
count++;
}
const int SIZE = count; //<- this is the place i'm struggling with
Beer allBeers[SIZE]; //expression must have a constant value
Beer currentBeer;
for (int i = 0; !file.eof(); i++)
{
getline(file, currentBeer.name, '\t');
getline(file, currentBeer.rating, '\t');
getline(file, currentBeer.country, '\t');
getline(file, currentBeer.alc, '\t');
getline(file, currentBeer.type, '\n');
allBeers[i] = currentBeer;
}
}
file.close();
return 0;
}
如果您在编译时不知道大小,那么您应该使用 std::vector
代替。
https://en.cppreference.com/w/cpp/container/vector
#include <vector>
然后
std::vector<Beer> allBeers;
稍后,添加啤酒:
allBeers.push_back(currentBeer);
如果在编译期间不知道数组的大小,只需使用 std::vector
:
#include <vector>
// ...
// const int SIZE = count; // you don't need this anymore
std::vector<Beer> allBeers;
// ...
allBeers.push_back(currentBeer); // to append it to your 'array'
vector
s 的行为与数组非常相似,但是当使用 push_back
时,它们 'grow' 如果需要的话。请注意,它们可能会保留比必要的多一点的内存,这样它们就不必在您每次调用 push_back
时都增长。要释放此保留内存,您可以在之后调用 shrink_to_fit
一次。
如果您不想使用 shrink_to_fit
,您也可以预先使用
vector
精确设置为您需要的尺寸
const int SIZE = count;
std::vector<Beer> allBeers;
allBeers.reserve(SIZE);
您的代码的 main 问题在以下两行中:
const int SIZE = count; //<- this is the place i'm struggling with
Beer allBeers[SIZE]; //expression must have a constant value
现在,虽然 SIZE
被定义为 const
但它是 而不是 和 编译时 常量!此外,C++
中的数组需要 编译时 常量的维度。 (您的 const
限定符仅意味着,一旦初始化,SIZE
的值就无法更改。)
解决此问题的简单 "old-style-C++" 方法是将 allBeers
声明为 指针 并使用 new
运算符创建运行 时的 'array buffer'(当 SIZE
的 实际 值已知时):
const int SIZE = count; // Don't really need this, now - could just use "count"
Beer* allBeers = new Beer[SIZE]; // You can still use allBeers[i] to access!
但是,在这里,您应该确保在完成 array/buffer 后执行 delete[] allBeers;
。
一种更现代的方法是使用 std::vector
类型,在这种情况下,当对象超出范围时,释放内存会自行解决:
const size_t SIZE = size_t(count);
std::vector<Beer> allBeers(SIZE);
同样,您可以使用 allBeers[i]
.
随时要求进一步澄清and/or解释。