3

我正在学习 C++,并了解到 int 类型只是预制类。所以我想也许我应该尝试创建一个。

我想做的基本上是一个普通的int类

int x;
x=7;
cout << x;

// 屏幕上的输出是 7。

所以同样...

abc x;
x=7;
cout << x;

我会放什么

class abc{
\\ HERE!!!!!! 
};

所以我可以这样做

class SomeClass {
public:
    int x;

    SomeClass(int x) {
        this->x = x;
    }
};

int main(int argc, char *argv[]) {
    SomeClass s = 5;

    cout << s.x << "\n"; // 5

    s = 17;

    cout << s.x << "\n"; // 17

    return 0;
}

但正如你所看到的,我必须使用 sx 来打印值——我只想使用 's'。我做它是作为一个实验,我不想听到这种方法是好是坏,是无意义的还是革命性的,或者是做不到的。我记得我做过一次。但只能通过复制和粘贴我不完全理解甚至忘记的代码。

4

5 回答 5

6

并了解到 int、types 只是预制类

这是完全错误的。尽管如此,您仍然可以完全控制类在表达式中的行为方式,因为您可以(几乎)重载任何运算符。您在这里缺少的是执行operator<<时调用的通常重载:

cout<<s;

您可以像这样创建它:

std::ostream & operator<<(std::ostream & os, const SomeClass & Right)
{
    Os<<Right.x;
    return Os;
}

有关详细信息,请参阅有关运算符重载的常见问题解答。

于 2012-09-26T20:27:58.670 回答
2

您需要operator<<为您的课程重载,如下所示:

class abc
{
public:
    abc(int x) : m_X(x) {}

private:
    int m_X;

    friend std::ostream& operator<<(std::ostream& stream, const abc& obj);  
};

std::ostream& operator<<(std::ostream& os, const abc& obj)
{
    return os << obj.m_X;
}

除非您想访问受保护/私人成员,否则friend您不必超载。operator<<

于 2012-09-26T20:28:10.473 回答
2

您必须在您的类中将abc运算符定义为 int 并从 int 中定义赋值运算符,就像在这个模板类中一样:

template <class T>
class TypeWrapper {
public:
  TypeWrapper(const T& value) : value(value) {}
  TypeWrapper() {}
  operator T() const { return value; }
  TypeWrapper& operator (const T& value) { this->value = value; return *this; }
private:
  T value;
};

int main() {
  TypeWrapper<int> x;
  x = 7;
  cout << x << endl; 
}
于 2012-09-26T22:17:38.717 回答
1

<< 和 >> 基本上是函数名。你需要为你的班级定义它们。与 +、-、* 和所有其他运算符相同。方法如下:

http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html

于 2012-09-26T20:26:07.110 回答
0

您想重载输出运算符:

std::ostream& operator<< (std::ostream& out, SomeClass const& value) {
    // format value appropriately
    return out;
}
于 2012-09-26T20:27:45.017 回答