【问题标题】:C++ pre-computations inside of a class constructor类构造函数内部的 C++ 预计算
【发布时间】:2022-11-26 00:07:36
【问题描述】:

我是 C++ (c++11) 的初学者,我试图了解如何在构造函数中初始化数据,然后在内部方法中使用这些预先计算的信息。在 Python 中,我可以很容易地完成以下操作:

class SumClass:

    def __init__(self, file_path):
        self._file_lines = self.read_file(file_path)

    def self.read_file(file_path):
        # read file
        pass

    def calculate_sum(self):
        calculated_sum = 0
        for element in self._file_lines:
             calculated_sum += element
        return calculated_sum

sumClass = SumClass(file_path)
sum1 = sumClass.calculate_sum()
sum2 = sumClass.calculate_sum()

要点是,使用这段代码,我只读取一次文件,同时计算总和,并期望在 C++ 中也是如此。

那是我尝试过的,但是每当我运行代码时,sales_lines 的大小都是 0,所以它不起作用:(

//sum.hpp 

class SumClass
{
public:
    const std::vector<std::uint32_t> sales_lines;
    SumClass::SumClass(std::string sales_path);
    SumClass::size_t calculate_sum();
}
//sum.cpp
#include "sum.hpp"
class SumClass
{

static vector<std::string> read_file(std::string sales_path){
    vector<std::uint32_t> file_lines;
    // read file
    return file_lines;
}
 

SumClass(std::string sales_path){
    vector<std::uint32_t> sales_lines = read_file(sales_path);
}

size_t calculate_sum()
{
    size_t calculated_sum = 0;
    for (auto element in sales_lines) calculated_sum+= element;
    return calculated_sum;
}

}
//main.cpp
#include "sum.hpp"

main(){
SumClass sum_obj(file_path);
auto sum1 = sum_obj.sum()
auto sum2 = sum_obj.sum()
auto sum3 = sum_obj.sum()
}

【问题讨论】:

  • 这不编译。你的实际代码是什么?
  • 如果您先从 Python 代码中删除 self,您认为会发生什么?你在 C++ 中做同样的事情。
  • SumClass构造函数中的vector&lt;std::uint32_t&gt; sales_lines = read_file(sales_path);行声明了一个局部变量sales_lines,它是一个完全独立于类成员变量SumClass::sales_lines的变量。
  • 成员sales_lines不应该是const。改为私有。此外,您的 read_file() 函数不会读取任何内容,留下评论不会神奇地进行读取:D(是的,您正在用本地成员向量隐藏您的成员向量)因此为什么每次都为零,范围-based for 循环不会迭代,因为向量为空,因此它返回先前初始化的零。如果那不是您的真实代码,请发布您的真实代码,否则它毫无意义,我们无法帮助您解决您没有展示的问题 :)

标签: c++ class c++11


【解决方案1】:

您只是设置了一个与字段同名的局部变量。

改变:

SumClass(std::string sales_path){
    vector<std::uint32_t> sales_lines = read_file(sales_path);
}

至:

SumClass(std::string sales_path){
    sales_lines = read_file(sales_path);
    // shortcut of: this->sales_lines = read_file(sales_path);
}

【讨论】:

  • 不会编译为sales_lines(错误地?)const。 SumClass(std::string sales_path) : sales_lines(read_file(sales_path)) {} 可以。
猜你喜欢
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多