是否可以为类设置自定义返回类型?

时间:2018-01-07 00:57:49

标签: c++ class return

是否可以为类提供特定的返回类型?

例如,我想创建一个名为Sentence的类,它基本上是vector个字符串。那么它是否可以定义它以使它具有vector字符串的返回值(假设向量/数组可以是返回值)?

编辑:我现在很累,所以请原谅我糟糕的描述。我的意思是设置它以便您可以返回类,它将返回类中的特定变量。所以我基本上会创建一个Sentence类,就编译器而言,它是一个vector字符串,只是添加了一些函数。这样,​​如果我告诉函数{{1它将返回对象内的字符串向量。

2 个答案:

答案 0 :(得分:1)

一个类是一种类型。它用于定义对象;所以它不会返回任何东西。

但是,您可以定义转换运算符,以便将该类型的对象轻松转换为另一种对象。

示例:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Sentence {
    vector<string> words; 
public: 
    Sentence() : words{} {}     // construct an empty sentence
    void add(string word) {     // add a new word to the sentence
         words.push_back(word); 
    }
    operator vector<string> () {   // convert into a vector of string
        return words; 
   }
}; 

使用这样的转换运算符,您可以编写如下代码:

int main() {
    Sentence statement;      // create a sencence
    statement.add("hello");
    statement.add("word"); 

    vector<string> w = statement;   // convert the sentence into a vector

    for (auto& x : w) cout <<x<<" ";  // print the vector elements
    cout <<endl; 
    return 0;
}

您可以为不同的目标类型设置不同的转换运算符。例如,您可以将此类添加到类中:

operator string() { // conversion to string 
    string r{}; 
    for (auto x=words.begin(); x!=words.end(); r+=" ")
        r += *x++; 
    return r;
}

然后您可以按如下方式使用它:

string s = statement;  // convert the Sentence into a string 
cout<<s<<endl; 

<强> Online demo

答案 1 :(得分:1)

也许你想要conversion operator

#include <iostream>
#include <string>
#include <vector>
#include <initializer_list>

class Sentence 
{
private:

    std::vector<std::string> words;

public:

    Sentence(std::initializer_list<std::string> l) : words{ l } {}

    operator std::vector<std::string>() // conversion operator
    {
        return words;
    }
};


int main() 
{
    Sentence sentence {"hello", "world", "this", "is", "a", "test"};

    std::vector<std::string> arr = sentence; //indicate that you want it to be treated as array

    for (auto word : arr)
        std::cout << word << std::endl;

    return 0;
}

https://ideone.com/6pq3gE