#include "RandomGeneratorNAG.h"
RandomGeneratorNAG::RandomGeneratorNAG():RandomGeneratorNAG() {
}
/** Standard constructor.
* \param seed Seed for the randomGenerator
*/
RandomGeneratorNAG::RandomGeneratorNAG(int seed) {
g05cbc(seed);
}
/** Standard destructor.
*
*/
RandomGeneratorNAG::~RandomGeneratorNAG() {
}
在这一点上,我收到错误消息“错误:构造函数委托给它自己”。有什么问题吗?
将第一个功能更改为
RandomGeneratorNAG::RandomGeneratorNAG(){
}
我收到错误消息
“错误:没有匹配的函数来调用 'RandomGenerator :: RandomGenerator()'“
在这一点上。
RandomGeneratorNAG.h如下所示。
#ifndef RANDOMGENERATOR_RANDOMGENERATORNAG_H_
#define RANDOMGENERATOR_RANDOMGENERATORNAG_H_
#include "RandomGenerator.h"
/// To use this class, you must have WITH_NAG enabled in CMake.
class RandomGeneratorNAG: public RandomGenerator {
public:
RandomGeneratorNAG();
explicit RandomGeneratorNAG(int seed);
virtual ~RandomGeneratorNAG();
void getUniformRandomInt(int lowerBound, int upperBound, int* randNumber) ;
void getUniformRandomInt(int lowerBound, int upperBound, std::vector<int>* randNumbers, std::size_t size) ;
void getUniformRandomDouble(double lowerBound, double upperBound, double* randNumber) ;
void getUniformRandomDouble(double lowerBound, double upperBound, std::vector<double>* randNumbers, std::size_t size) ;
void getNormalRandomInt(double mu, double sigma, int* randNumber) ;
void getNormalRandomInt(double mu, double sigma, std::vector<int>* randNumbers, std::size_t size) ;
void getNormalRandomDouble(double mu, double sigma, double* randNumber) ;
void getNormalRandomDouble(double mu, double sigma, std::vector<double>* randNumbers, std::size_t size) ;
};
#endif /* RANDOMGENERATOR_RANDOMGENERATORNAG_H_ */
此外,RandomGenerator.h如下所示。
#ifndef _RandomGenerator_hpp_
#define _RandomGenerator_hpp_
#include <vector>
#if BUILD_TESTS
//Necessary include to test private functions with googleTest
#include "gtest/gtest_prod.h"
#endif
#include "../Parameter/Parameter.h"
#include "../Writer/Writer.h"
class RandomGenerator {
#if BUILD_TESTS
FRIEND_TEST(RandomGeneratorTest, seed);
#endif
protected:
int seed;
static int createSeed();
public:
virtual ~RandomGenerator();
RandomGenerator(int seed);
int getSeed(){return seed;}
static RandomGenerator* factory(Parameter* parameter, Writer* writer);
virtual void getUniformRandomInt(int lowerBound, int upperBound, int* randNumber) = 0;
virtual void getUniformRandomInt(int lowerBound, int upperBound, std::vector<int> *randNumbers, std::size_t size) = 0;
virtual void getUniformRandomDouble(double lowerBound, double upperBound, double* randNumber) = 0;
virtual void getUniformRandomDouble(double lowerBound, double upperBound, std::vector<double> *randNumbers,
std::size_t size) = 0;
virtual void getNormalRandomInt(double mu, double sigma, int* randNumber) = 0;
virtual void getNormalRandomInt(double mu, double sigma, std::vector<int> *randNumbers, std::size_t size) = 0;
virtual void getNormalRandomDouble(double mu, double sigma, double* randNumber) = 0;
virtual void getNormalRandomDouble(double mu, double sigma, std::vector<double> *randNumbers, std::size_t size) = 0;
};
#endif
答案 0 :(得分:1)
RandomGeneratorNAG::RandomGeneratorNAG():RandomGeneratorNAG()
{
}
是错误的。 :RandomGeneratorNAG()
位不正确。该语法用于调用另一个构造函数。在您的情况下,它是您要委派的同一构造函数。这将导致无限循环。也许这是一个错字。从代码中删除该部分并使用:
RandomGeneratorNAG::RandomGeneratorNAG()
{
}
如果要使用种子值为0
的其他构造函数,请使用:
RandomGeneratorNAG::RandomGeneratorNAG() : RandomGeneratorNAG(0)
{
}
您可以在https://en.cppreference.com/w/cpp/language/initializer_list#Delegating_constructor和http://www.stroustrup.com/C++11FAQ.html#delegating-ctor上了解有关委派构造函数的更多信息。
RandomGeneratorNAG::RandomGeneratorNAG()
{
}
等同于
// The default constructor of the base class is called.
RandomGeneratorNAG::RandomGeneratorNAG() : RandomGenerator()
{
}
由于基类没有默认的构造函数,因此编译器在该行中报告错误。
您可以通过以下方式解决问题:
更改派生类的默认构造函数的实现。
RandomGeneratorNAG::RandomGeneratorNAG() : RandomGenerator(0)
{
}
答案 1 :(得分:0)
您的默认构造函数在成员初始化列表中调用自身,这将导致无限循环(假设编译器允许这样做,显然不是这种情况):
RandomGeneratorNAG::RandomGeneratorNAG() : RandomGeneratorNAG() {}
// ^^^^^^^^^ Doesn't work
如果您的默认ctor根本不需要执行任何初始化,只需通过删除初始化即可解决
RandomGeneratorNAG::RandomGeneratorNAG() {}