【问题标题】:Not able to access a vector from private data section? [closed]无法从私有数据部分访问向量? [关闭]
【发布时间】:2016-07-03 03:30:23
【问题描述】:

我有一个 C++ 任务,要在 C++ 中创建一个更随机的随机数生成器。具体可查看:http://www.cplusplus.com/forum/beginner/97056/

每次我尝试访问私有数据部分中的向量时都会收到一条错误消息,但我不知道为什么?

我还使用了我们单独创建的复杂的 Double 和 Integer 类。

头文件:

 #ifndef RANDOM
 #define RANDOM

 #include "Double.h"
 #include "Integer.h" 
 #include <vector>
 #include <iostream>
 #include <time.h>


 const int VECT_SIZE =250;
 const int PERCENT = 225;

 class Random
 {
 private:
     std::vector<double> vect(int(VECT_SIZE));
     void fillVect(double min, double max);
     void shuffle();

int index;

 public:
     Random(); // Default constructor 
     Random(double min, double max); 
     Random(Double min, Double max);
     Random(int min, int max); 
     Random(Integer min, Integer max); 

     Random(int seed); //seed the random number generator
     int nextInt(); // Returns the next random number as an int
     double nextDbl(); 
     void setRange(double min, double max); 
     Integer nextInteger();
     Double nextDouble();

 };
 #endif

似乎有错误的部分主类:

 void Random::fillVect(double min, double max)
 {
     for(int i = 0; i < VECT_SIZE; i++)
         {
    this->vect.push_back((((double)rand()/(double)RAND_MAX)*(max - min)) + min);

 }
shuffle();

 }
 void Random::shuffle()
 {
     index =0;
     for (int i = 0; i <100; i++)
     {
         int r = rand() % VECT_SIZE;
         this->vect.push_back(vect[r]);
     } 
 }

似乎有错误的部分主类:

 Random::Random(double min, double max)
 {
     vect.clear();
     fillVect(min, max);
 }

似乎有错误的部分主类:

 double Random::nextDbl()
 {
     if(index>PERCENT)
     {
         this->shuffle();
     }
     index++;
     return this->vect[index];    
 }

【问题讨论】:

  • 打开编译器警告并听取它们。
  • 请将此代码块缩减为minimal reproducible example
  • 当我将数据部分中的向量更改为:std::vector vect; ,我在构建时没有错误,只有在它运行时才会出现错误,当我确实遇到错误时,它们似乎都与访问vect有关,就像我说的那样。我正在尽我所能“倾听”。我会尝试向下编辑,但当我不知道出了什么问题时,这很困难

标签: c++ class random vector private


【解决方案1】:

这被称为most vexing parse

您对vect 的声明当前是一个采用int 并返回vector&lt;double&gt; 的函数。大多数(所有?)优秀的编译器都应该对此发出警告以及可能的解决方案。

将声明更改为:

std::vector<double> vect = std::vector<double>(int(VECT_SIZE));

【讨论】:

  • @juanchopanza OMG 我完全没注意到,谢谢。
  • 我不太明白你所说的取整数是什么意思?我之前在该行没有错误,当我尝试您的第一行代码时,我收到错误“C++ 需要所有声明的类型说明符”,当我尝试您的第二行时,我没有收到错误,但是该行是线程断点时我尝试运行它。我正在使用 XCode,如果它有帮助的话。
  • @Io-stream 第二个不起作用,因为vector 有一个初始化列表构造函数,第一个也是一个错误,因为我忘记了它是类内初始化。这个应该可以解决错误,尽管任何运行时错误都是不同颜色的马。我的意思是它被读作std::vector&lt;double&gt; vect(int VECT_SIZE);,这是一个函数声明。
  • 好吧,这确实解决了编译器错误,但我仍然在该行遇到运行时错误。对不起,我没有更多的意见,我对此很陌生......
  • 好的,我想我理解它是如何被误读为函数的,但如果我将行简化为 'vector vect;'我在所有相同的地方都有断点(在最初的问题中列出),我认为这是因为我没有设置向量的大小,但添加大小只会给我更多的错误。
猜你喜欢
  • 2014-09-20
  • 1970-01-01
  • 2014-01-20
  • 2011-04-12
  • 2014-08-15
  • 2013-08-03
  • 2012-11-06
  • 1970-01-01
  • 2012-09-30
相关资源
最近更新 更多