OOP和字符串指针的怪异行为

时间:2018-07-09 03:47:32

标签: c++ oop pointers

这是我的代码:

update 
    TableB
set
    Val2 = a.Val2
from TableB b
inner join TableA a
on a.ID = bookmarking.ID and ABS(bookmarking.Val1) between a.Val2 and a.Val2

好吧,它应该像这样打印一条消息: “你好,我叫玛莎”,但不会打印“你好,我叫玛莎”字符串或“玛莎”名字。为什么会发生?

3 个答案:

答案 0 :(得分:2)

修复很简单,可以完全删除所有指针;请参阅下面的代码。我的代码中有许多问题需要我详细解决,包括内存泄漏,未初始化的变量和指针的普遍误用,但是看来您可能来自不同的语言背景,应该花点时间学习良好的实践以及good C++ book中现代C ++中的重要语义和习语。

#include <iostream>
#include <string>

class Human
{
public:
    std::string name;
    void introduce();
};

void Human::introduce()
{
    std::cout << "Hello, my name is " << name << std::endl;
}

int main()
{
    Human martha;
    martha.name = "Martha";
    martha.introduce();

    return 0;
}

答案 1 :(得分:0)

对代码的修改很少。 更新的代码以及对所做更改的注释包括在下面。

#include <iostream>
#include <string>

class Human
{
public:
    //Removed pointer to a string
    //Cannot have an instantiation inside class declaration
    //std::string * name = new std::string();
    //Instead have a string member variable
    std::string name;
    void introduce();
};

void Human::introduce()
{
    //Human::name not required this is a member function
    //of the same class
    std::cout << "Hello, my name is " << name << std::endl; 
}

int main()
{
    Human *martha = new Human();
    //Assign a constant string to string member variable
    martha->name = "Martha";
    martha->introduce();

    return 0;
}

如@alter igel所建议-The Definitive C++ Book Guide and List将是一个不错的起点。

答案 2 :(得分:-2)

#include <iostream>
#include <string>

class Human {
public:
    void Human(std::string* n) { name = n; }
    void introduce();
private:
    std::string* name;
};

void Human::introduce() {
    std::cout << "Hello, my name is " << name << std::endl;
}

int main() {
    Human* martha = new Human(new std:string("Martha"));
    martha->introduce();

    return 0;
}

尝试一下。不同之处在于您没有在类定义中初始化变量,而是使用构造函数来初始化名称。您可以将方法定义拆分为自己的部分,但只有一行,可以放在类定义中。