-3

我想通过在我自己的标题中使用从用户那里获取三个变量...

这是我写的一段代码......

<class T>
Sparse<T>::Sparse(){

    std::cout << "Please Enter The Following Information" << std::endl << "Row:" ;
    std::cin >> this->rows;
    std::cout << "Column:" << std::endl;
    std::cin >> this->column;
    std::cout << "Please Enter The Number of TermS:" << std::endl;
    std::cin >> this->term;

}

我在自己的标题中使用了前向声明:

  class cin;

我遇到的问题是你可以看到类的函数没有循环但是......

当我运行代码时,编译器运行这个块 multi_Times ...就像 cin 只是无法初始化变量...

像这样

  "Please Enter The Following Information"
  "Rows:"
  "Columns:"
  "Please Enter The Number of TermS:"
  "Please Enter The Following Information"
  "Rows:"
  "Columns:"
  "Please Enter The Number of TermS:"

请帮忙 .....

额外细节....

正如科芬先生所说,我想使用“转发声明”请帮助我......我必须如何使用......因为在另一个标题中包含一个标题是一种糟糕的使用方式......

是的,我有两个构造函数,一个以这种方式获得另一个构造函数的参数....这是因为我不想在我的主中使用 cin 和 cout 以及大量的等式(=)...谢谢 Mr.Coffin ……

4

1 回答 1

3

类的构造函数用于对象的初始创建。在此示例中,这是默认构造函数。一般来说,您可能不想在类的构造函数中编写面向用户的问题,更不用说默认构造函数了。

以自己的方式编写意味着每次创建未初始化的 Sparse 时,都会向用户询问这些问题。

Sparse<int> a, b;

这会调用构造函数两次,问问题两次,迫使用户在不知道他们被问到哪个“稀疏”的情况下回答问题。

Sparse<int> a, b;

if (day == "Monday") {
    a.something();
} else {
    b = a;
}

在这里,用户会被提示只在一周中的某一天有意义的问题。

但是您也会遇到以下问题:

std::vector<Sparse<int>> manySparses;
manySparses.resize(1000);

现在将向用户提出这些问题...... 1000 次。

选择以下两种方法之一: 在构造对象之前提出问题;或选择合理的默认值 - 例如指示“我还没有值”的值,然后在构造后填充值,

您可以有一个静态成员来询问问题,也可以有一个成员在构造对象后询问他们:

Sparse<int> a, b;
a.GetConstraints();
if (day == "Monday")
    b.GetConstraints();
else
    b = a;

但是不要编写一个默认构造函数来询问用户这样的问题。

---- 编辑,关于 'cin' ----

'cin' 不是一个类。它是一个对象。为了可移植性和正确的良好实践,您不应该注入自己的尝试来声明这样的标准库类型/结构/函数,尤其是在标头中。

相反,接受它作为依赖项并

#include <iostream>

在你尝试使用它之前,在你的头文件中。

---- 编辑:最后的注释----

当你在编程意义上考虑“建设”时,试着从“决定我要建造一座摩天大楼”的规模上去思考,而不是“承担建造帝国大厦的工作,出售 101 层的空间和招聘一个管理团队”。

并不是说您不能/不应该编写复杂的构造函数,而是您的目标应该只是让对象进入程序的可靠状态。

class string {
public:
    string() {
        std::cout << "Enter the string you want: ";
        std::cin >> m_string;
        m_length = strlen(m_string);
    }
    ...
};

对比

class string {
public:
    string() : m_string(NULL), m_length(0) {}
    ...
};

其次,拥有一个与标准输入/输出对话的构造函数从根本上削弱了它的实用性。使用该逻辑从用户那里获取值没有问题,但是如果将其放入类的构造函数中,则该类只能在具有标准输入/输出的应用程序中使用(gui 和无头应用程序都不需要应用)。

第三,你将如何处理错误?如果 cin 在第一个问题后关闭怎么办?您的代码不会检查它,如果检查了,它必须将负担转嫁给创建对象的人。没有人期望必须写

try {
    Object myObject; // may fail if user types 'wibble' instead of '13'.
} catch (wibble_input_as_columns_exception& e) {
    std::cerr << "Damnit, Dave, 'wibble' is not a valid number of columns." << std::endl;
}
于 2013-11-03T05:32:39.253 回答