初学者字符串,构造函数

Posted

技术标签:

【中文标题】初学者字符串,构造函数【英文标题】:A beginner string, constructors 【发布时间】:2015-05-28 05:58:06 【问题描述】:

我正在为我的课程编写代码,但我遇到了一个问题。我以前从未在 C++ 中处理过字符串,而且我不知道如何将一个字符串分成另外两个。程序也可以编译,但输出错误,我怀疑构造函数。有人可以看看并给我一个回答,我应该改变什么才能使代码正常工作吗?我将不胜感激:)

代码如下: main(老师给的)

   int main()

    oop::Data a;
    oop::Data b;

  
        MACRO1;//co tu ma się dziać?
    Data b;     
  

    const oop::Data Data_element = "Test-first"; // tworzony jest obiekt const o nazwie Data_element klasy Data, do którego wpisywany jest teks

    const oop::Data c(Data_element, "Test-second"); // wywołanie konstruktora

    a.full_data("Pierwszy Drugi");
    b.first() = b.second("Tekst testowy"); //co tu ma się dziać?

    std::cout
        << "a = " << a << std::endl;
    std::cout           
        << "b = " << b.full_data() << std::endl;
    std::cout
        << "c = " << c.first() << ", " << c.second() << std::endl;


    const oop::Data d = a.to_upper(); //zamienia na WIELKIE litery
    oop::Data e = d.to_lower(); //zamienia na mnałe litery

    std::cout
        << "d = " << d << std::endl;
    std::cout
        << "e = " << e << std::endl;



/* Output:
a = ["Pierwszy", "Drugi"]
b = ["Tekst testowy", "Tekst testowy"]
c = Test-first, Test-second
d = ["PIERWSZY", "DRUGI"]
e = ["pierwszy", "drugi"]
*/

.h 文件:

#define MACRO1 using namespace oop;
//Makro !

#include <string>
#include <iostream>


namespace oop

    class Data
    
    public:
        Data(const char*);//Konstruktor ma przyjac const char* a nie string bo " text " to const char*
        Data(const Data&,const char*);
        Data();
        Data(const Data&);//dla linijki 35
        ~Data();


        void first_data(char* data);
        std::string first() const;
        const char* second()const;//to sie przyda
        std::string second(std::string data) const;
        //const char* full_data(const std::string data);
        void full_data(const std::string data);
        const char* full_data();
        Data to_upper(void) const;//const dodajesz tutaj zawsze jak nie zmieniasz obiektu zeby metoda dzialala na const obiekcie
        Data to_lower(void) const;

        friend std::ostream & operator <<(std::ostream & wypisz, const Data& data);


    private:
        const char* _text1;
        const char* _text2;

    ;

    inline std::ostream & operator <<(std::ostream & wypisz, const Data& data)
    return (wypisz<<"[\"" << data._text1 << " \", \" " << data._text2 << "\" ]");


#endif

.cpp 中的函数

    #include <iostream>
#include "lab07.h"
#include <string>

//konstruktor*******************************************************************************************************
    oop::Data::Data(const char* c)
    _text1=c;

    oop::Data::Data(const Data& object,  const char* c)
    
        _text1 = object._text1;
        _text2 = c;
    

    oop::Data::Data() //tu chyba nic nie jest potrzebne
    oop::Data::Data(const Data& object)
    
        _text1 = object._text1;
        _text2 = object._text2;
    

    oop::Data::~Data() //tu chyba nic nie jest potrzebne

//funkcje*******************************************************************************************************
    void oop::Data::first_data(char* data)

    std::string oop::Data::first()const
    return std::string(" ");

    std::string oop::Data::second(std::string data)const
    return std::string(" ");

   /* const char* oop::Data::full_data(const std::string data)
    return " ";*/
    void oop::Data::full_data(const std::string data)
    
        int size = data.size();
        int space = data.find(' ');
        //_text1 = data.substr(0,space);
       // _text2 = data.substr(space,size);



    return ;

    const char* oop::Data::full_data()
    return " ";

    oop::Data oop::Data::to_upper(void)const
    return *this;

    oop::Data oop::Data::to_lower(void)const
    return *this;

    const char* oop::Data::second()const
    return " ";

【问题讨论】:

请把表扬改成英文好吗? 它给出了什么输出,你期望什么? @b4hand my psychic power predict: /* 输出:a = ["Pierwszy", "Drugi"] b = ["Tekst testowy", "Tekst testowy"] c = Test-first, Test -second d = ["PIERWSZY", "DRUGI"] e = ["pierwszy", "drugi"] */ 在您开始怀疑构造函数或拆分字符串之前,您应该担心您的 funkcje 完全没有实现。 (您真的对什么都不做或返回" " 会产生错误的结果感到惊讶吗?)在开始将字符串分成更多字符串之前,让其余的代码正常工作。另外,如果您被允许std::string,请始终如一地这样做。 【参考方案1】:

有很多方法可以做到这一点。这里有两个:

快捷方式:串流

stringstream ss(data);
string tstr;
ss >> tstr;  // every call to >> reads one bunch of characters up to the first whitespace.

然后制作一个大小合适的char数组,将tstr复制到char数组中,并将char数组赋值给_text1。重复 _text2。一个问题:像“the quick brown fox”这样的字符串会变成“the”,而剩下的字符串会丢失。

困难的方法:find and substr

string tstr;
size_t loc = data.find(' ');
if (loc != data.npos)

    tstr = data.substr(0, loc);
    //Copy tstr into _text1
    tstr = data.substr(loc + 1, data.npos);
    //Copy tstr into _text2

这个更适合“快速棕色狐狸”的案例。它会产生“the”和“quick brown fox”。

【讨论】:

以上是关于初学者字符串,构造函数的主要内容,如果未能解决你的问题,请参考以下文章

Python代码阅读(第38篇):根据谓词函数和属性字符串构造判断函数

复制构造函数(拷贝构造函数)

深度分析C++默认构造函数拷贝构造函数

构造函数产生的点及原因

如何将一个构造函数的值设置为另一个构造函数的值? [复制]

为啥构造函数在java中不被继承?