让一个类使用另一个类的对象

时间:2015-03-02 14:50:38

标签: c++ class constructor static

我有一个类,我想要包含来自另一个类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];                     
};

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

你宣布一个功能,而不是一个对象:

CRandomSFMT rangen();

因为你试图将它用作对象应该是这样的:

CRandomSFMT rangen;

答案 1 :(得分:2)

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

从你的描述,“我想要包含一个对象”,它应该是一个对象而不是一个函数:

CRandomSFMT rangen;  // no ()

必须使用其构造函数初始化:

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