我最近开始使用c ++,当我想使用像Java的枚举这样的c ++类时,我遇到了麻烦。 我会有'模拟枚举'类属性,但是当我尝试在构造函数中初始化属性时,我收到以下错误:
model :: suite
不存在默认构造函数
我现在将构造函数设为私有,但枚举应该有私有构造函数来阻止构造该类的未定义对象。
¿我该怎么办?
e.g。
suite.h
#include <iostream>
#include <string>
#include <vector>
namespace model
{
class Suite
{
public:
static const Suite CLUBS;
static const Suite DIAMONDS;
static const Suite SPADES;
static const Suite HEARTS;
static const int SIZE = 4;
private:
std::string name;
Suite(std::string name)
{
this->name = name;
}
public:
std::string toString()
{
return name;
}
std::vector<Suite> values()
{
return {Suite::CLUBS, Suite::DIAMONDS, Suite::SPADES, Suite::HEARTS};
}
};
const Suite Suite::CLUBS = Suite("CLUBS");
const Suite Suite::DIAMONDS = Suite("DIAMONDS");
const Suite Suite::SPADES = Suite("SPADES");
const Suite Suite::HEARTS = Suite("HEARTS");
}
card.h
#pragma once
#include <string>
#include "suite.h"
#include "face.h"
namespace model
{
class Card
{
public:
Card(int face, int suite);
Face getFace();
Suite getSuite();
bool isMergeable();
std::string toString();
private:
Face face;
Suite suite;
bool isRed();
bool isContigous(Card card);
};
}
card.cpp
#include <iostream>
#include "card.h"
using namespace std;
using namespace model;
Card::Card(int face, int suite)
{
this->face = Face::VALUES[face];
}
Face Card::getFace()
{
}
Suite Card::getSuite()
{
}
bool Card::isMergeable()
{
}
std::string Card::toString()
{
}
bool Card::isRed()
{
}
bool Card::isContigous(Card card)
{
}
答案 0 :(得分:0)
最后我找到了解决方案。
当我们尝试实施“模拟枚举”时在cpp文件中,我们有this->
指针以及包含它的范围(范围规则),因此我们需要在构造函数的{ }
之前定义对象。
#include <iostream>
#include "card.h"
using namespace std;
using namespace model;
Card::Card(Face face, Suite suite) : face(face), suite(suite)
{
}
通过这种方式,我们可以使用属性和方法实现更强大,更实用的枚举。