构造函数体中的简单指针语法问题 所以我在C++和C语言中是全新的,现在我们有一个项目,几天内我就快要完成了。然而,我时不时会遇到一些问题。现在,我在通过构造函数正确分配类数据成员方面遇到了一个问题

构造函数体中的简单指针语法问题 所以我在C++和C语言中是全新的,现在我们有一个项目,几天内我就快要完成了。然而,我时不时会遇到一些问题。现在,我在通过构造函数正确分配类数据成员方面遇到了一个问题,c++,pointers,constructor,C++,Pointers,Constructor,下面是我试图创建的有问题类的代码: #include <iostream> #include <string> class Set{ private: int *setOfElements; int noOfElements; public: Set::Set(int *setArray){ setOfElements = setArray; noOfElements = setArray->length(); } int *getSetO

下面是我试图创建的有问题类的代码:

#include <iostream>
#include <string>

class Set{

private:

int *setOfElements;
int noOfElements;

public:
Set::Set(int *setArray){
    setOfElements = setArray;
    noOfElements = setArray->length();
}

int *getSetOfElements(){ return setOfElements; }
int getNoOfElements(){ return noOfElements; }

int findMedian();
int findMean();

};
#包括
#包括
类集{
私人:
int*元素集;
国际面条;
公众:
Set::Set(int*setArray){
集合元素=集合数组;
noOfElements=setArray->length();
}
int*getSetOfElements(){return setOfElements;}
int getNoOfElements(){return noOfElements;}
int findMedian();
int findMean();
};
错误出现在构造函数主体的第二行中。如果我将int数组作为参数传递,那么当我想要引用该参数的长度时,我不必使用
->而不是。因为referent是指针对象而不是传统意义上的对象

顺便说一下,VS2010中的错误是,“错误:表达式必须有指向类类型的指针”


谢谢

int
不是类,绝对没有
length()
元素。您正被“试图将另一种语言复制并粘贴到C++中”的邪恶势力所腐蚀。唯一的解决办法是“学习C++”


你为什么还要自己写一套呢?该语言附带
std::set

int
不是类,绝对没有
length()
元素。您正被“试图将另一种语言复制并粘贴到C++中”的邪恶势力所腐蚀。唯一的解决办法是“学习C++”

你为什么还要自己写一套呢?该语言附带
std::set

  • 要回答您对DeadMG答案的评论中的问题,即使这不是您在这里的主要问题:通常,您需要在C中传递数组长度和指针(以及在C++中使用C样式时)。以Null结尾的字符串是一个例外,因为您可以根据需要发现长度

  • 我同意DeadMG的建议,即使用标准库中的
    std::set
    ,而不是编写自己的类。您还需要使用标准库的几个其他位来获得
    findMedian
    findMean
    的行为:

  • #包括 #包括 std::集s; //初始化它。。。 int mean=std::累加(s.begin(),s.end(),0); 平均值/=s.size();//你真的想用双人床吗? //set是有序的,因此查找中间值只是迭代到中间。 整数中值; std::set::迭代器i=s.begin(); 标准::前进(i,s.尺寸()/2); 如果(s.size()%2==1){ 中位数=*i; }否则{ 中位数=(*i++*(+++i))/2; }
  • 要回答您对DeadMG答案的评论中的问题,即使这不是您在这里的主要问题:通常,您需要在C中传递数组长度和指针(以及在C++中使用C样式时)。以Null结尾的字符串是一个例外,因为您可以根据需要发现长度

  • 我同意DeadMG的建议,即使用标准库中的
    std::set
    ,而不是编写自己的类。您还需要使用标准库的几个其他位来获得
    findMedian
    findMean
    的行为:

  • #包括 #包括 std::集s; //初始化它。。。 int mean=std::累加(s.begin(),s.end(),0); 平均值/=s.size();//你真的想用双人床吗? //set是有序的,因此查找中间值只是迭代到中间。 整数中值; std::set::迭代器i=s.begin(); 标准::前进(i,s.尺寸()/2); 如果(s.size()%2==1){ 中位数=*i; }否则{ 中位数=(*i++*(+++i))/2; }
    我想我对C++中原始数据类型的指针(C也一样)感到困惑。在这里,char *等于字符串(char *是指向字符串中的第一个字符,然后遍历其他字符数组)。我看到代码告诉我,这对于整数也是可能的(并且大概是任何原始的)。如果我使用int*arr与int-arr[]这两种方法的唯一区别不是它们的分配方式(堆栈上的动态vs(在退出作用域时将被销毁))?这是一个单独的问题,与我原来的帖子无关。@Gthoma2:
    char*
    不是字符串
    char*
    是指向一个字符的指针<代码>标准::字符串是一个字符串。你需要找到更好的学习材料。
    int*
    int[]
    之间没有区别。您不应该以这种方式传递数组,因为许多原因,它非常糟糕。使用标准的
    std::array
    std::vector
    。同样,我目前正在尝试学习所有这些,所以我可能在这里错了,但是您不能将绑定到char*的标识符视为字符串吗?我知道,实际上,它是一个指向单个字符的指针,但您不能遍历绑定到该标识符的其余字符吗?如果int*和int[]之间没有区别,并且两者都可以被视为数组,那么这同样适用于与char[]相同的char*,我们都知道,字符串只是字符数组。所以char*是一个字符串。这正是让我困惑的地方,我意识到这是一个C事件,而不是C++事件。我将使用STD库中的类。我猜我对C++中的原始数据类型的指针感到迷惑(C也是如此),char *等于字符串(char *是指向字符串中的第一个字符,然后遍历其他字符数组)。我看到代码告诉我,这对于整数也是正确的。如果我使用int*arr和int-arr[]并不是这两者之间唯一的区别,它们是如何分配的(动态的vs-on) #include <iterator> #include <numeric> std::set<int> s; // Initialize it... int mean = std::accumulate(s.begin(), s.end(), 0); mean /= s.size(); // Would you really want to use a double? // std::set is ordered, so finding the median is just iterating to the middle. int median; std::set<int>::iterator i = s.begin(); std::advance(i, s.size() / 2); if (s.size() % 2 == 1) { median = *i; } else { median = (*i + *(++i)) / 2; }