【问题标题】:Having one class using objects from another让一个类使用另一个类的对象
【发布时间】:2015-03-02 14:50:38
【问题描述】:

我有一个类,我想包含来自另一个类CRandomSFMT 的对象(我自己没有编写)。这是test.h

using namespace std;
#include <cstdlib> 
#include <iostream>    
#include <iomanip>  
#include <sstream>
#include <fstream>
#include <stdio.h>    
#include <string.h>
#include "sfmt.h"

class Something {

    public:
    Something();

    private:
    int seed;
    CRandomSFMT rangen();
    void seed_generator(int, CRandomSFMT&);
};

这是test.cpp:

#include "test.h"

Something::Something() {
    seed=1;
    seed_generator(seed, rangen);

}

void Something::seed_generator(int seed, CRandomSFMT& rangen) {
    rangen.RandomInit(seed);
}

当我尝试用 g++ -c sfmt.o -msse2 -std=c++11 -O2 test.cpp 编译它时,我得到了

test.cpp: In constructor ‘Something::Something()’:
test.cpp:5:30: error: invalid use of non-static member function
   seed_generator(seed, rangen);

我尝试声明 seed_generator() 静态,但这没有帮助。这是CRandomSFMT类的声明:

class CRandomSFMT {                
public:
   CRandomSFMT(int seed, int IncludeMother = 0) {
      UseMother = IncludeMother; 
      LastInterval = 0;
      RandomInit(seed);}
   void RandomInit(int seed);                   
   void RandomInitByArray(int const seeds[], int NumSeeds);
   int  IRandom  (int min, int max);            
   int  IRandomX (int min, int max);            
   double Random();                             
   uint32_t BRandom();                          
private:
   void Init2();                               
   void Generate();                            
   uint32_t MotherBits();                      
   uint32_t ix;                                 
   uint32_t LastInterval;                       
   uint32_t RLimit;                             
   uint32_t UseMother;                          
   __m128i  mask;                               
   __m128i  state[SFMT_N];                      
   uint32_t MotherState[5];                     
};

有什么想法吗?

【问题讨论】:

    标签: c++ class constructor static


    【解决方案1】:

    您已将rangen 声明为一个函数;错误是因为您尝试像使用对象一样使用它。

    根据您的描述,“我想包含一个对象”,它应该是一个对象而不是一个函数:

    CRandomSFMT rangen;  // no ()
    

    这必须使用它的构造函数来初始化:

    Something::Something() : seed(1), rangen(seed) {}
    

    【讨论】:

    • 谢谢!但是现在我不断收到错误test.cpp: In constructor ‘Something::Something()’: test.cpp:3:23: error: no matching function for call to ‘CRandomSFMT::CRandomSFMT()’ Something::Something() { 我试着把它和你的最后一行完全一样,还有rangen(seed) rangen(seed, 0) 里面Something::Something() 之类的东西,但这没有帮助。
    • @jorgen:构造函数,正如我写的那样(初始化初始化列表中的对象,使用它的构造函数,构造函数主体中没有任何内容)应该可以工作。你确定那是你试过的吗?如果您不在这样的列表中初始化它,它将失败,并出现该错误。
    【解决方案2】:

    你声明的是一个函数,而不是一个对象:

    CRandomSFMT rangen();
    

    既然你想把它当作一个对象来使用,应该是这样的:

    CRandomSFMT rangen;
    

    【讨论】:

      猜你喜欢
      • 2017-08-16
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      相关资源
      最近更新 更多