#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_WORD_LENGTH 200
int main () {
FILE *fp = fopen("words.txt","r");
char str[60];
char *largest = (char*) malloc (MAX_WORD_LENGTH);
int smallest_len = MAX_WORD_LENGTH, largest_len = 0;
while (fgets (str, 60, fp) != NULL)
{
char *temp = strtok(str, "\n");
while (temp != NULL)
{
if (strlen(temp) > largest_len)
{
strcpy(largest, temp);
largest_len = strlen(largest);
}
temp = strtok(NULL, "\n");
}
}
printf("The largest word in the file is: %s\n", largest);
fclose(fp);
return 0;
}
我尝试过构建一个Screen实例。两者都无法访问 pos 。 顺便说一句,我知道访问控制。我只想知道类型成员的访问控制的含义。
答案 0 :(得分:3)
公共意味着任何人(其他类)都可以触摸这些变量。 私有意味着只有您(您的方法)才能触及这些变量。
有一个洞穴,它引入了#34;朋友&#34;,它提供了一个不是你的功能或类,可以访问所有变量。
成员类型和成员变量以相同的方式工作。除了类的方法和朋友之外,私有类型不可用,就像私有方法或变量一样。相反,任何人都可以访问公共类型,方法或变量。与(非静态)方法和变量不同,类型必须是静态的。
例如,由于pos是私有的,因此无法编译。
#include <string>
class Test {
private:
using pos = std::string::size_type;
public:
};
int main(int argc, char *argv[])
{
Test::pos a = 5;
return 0;
}
要从屏幕类外部访问类型pos
,请先将typedef移动到公共辅助功能。然后它将与screen::pos
一起使用,就像静态方法或变量一样。
以下应该编译得很好(可能是关于a
未使用的警告,但这是一个不同的问题。)
#include <string>
class Test {
public:
using pos = std::string::size_type;
};
int main(int argc, char *argv[])
{
Test::pos a = 5;
return 0;
}
你可以对此有点疯狂,甚至在内部将整个班级定义为公共或私人。
答案 1 :(得分:0)
因为虽然你的typedef是公共的,但实际的成员被声明为private。 有关详细信息,请参阅C++ class access specifiers。
答案 2 :(得分:0)
来源:https://www.tutorialspoint.com/cplusplus/cpp_class_access_modifiers.htm
公众会员
公共成员可以从课外的任何地方访问,但可以在程序中访问。您可以设置并获取没有任何成员函数的公共变量的值,如以下示例所示:
<强>代码:强>
#include <iostream>
using namespace std;
class Line {
public:
double length;
void setLength( double len );
double getLength( void );
};
// Member functions definitions
double Line::getLength(void) {
return length ;
}
void Line::setLength( double len) {
length = len;
}
// Main function for the program
int main() {
Line line;
// set line length
line.setLength(6.0);
cout << "Length of line : " << line.getLength() <<endl;
// set line length without member function
line.length = 10.0; // OK: because length is public
cout << "Length of line : " << line.length <<endl;
return 0;
}
输出上述代码:
Length of line : 6
Length of line : 10
私人会员:
无法访问私有成员变量或函数,甚至无法从类外部查看。只有class和friend函数才能访问私有成员。
默认情况下,类的所有成员都是私有的,例如在下面的类中,width是私有成员,这意味着在标记成员之前,它将被假定为私有成员:
class Box {
double width;
public:
double length;
void setWidth( double wid );
double getWidth( void );
};
实际上,我们在私有部分中定义数据,在公共部分中定义相关函数,以便可以从类外部调用它们,如以下程序所示。
<强>代码强>
#include <iostream>
using namespace std;
class Box {
public:
double length;
void setWidth( double wid );
double getWidth( void );
private:
double width;
};
// Member functions definitions
double Box::getWidth(void) {
return width ;
}
void Box::setWidth( double wid ) {
width = wid;
}
// Main function for the program
int main() {
Box box;
// set box length without member function
box.length = 10.0; // OK: because length is public
cout << "Length of box : " << box.length <<endl;
// set box width without member function
// box.width = 10.0; // Error: because width is private
box.setWidth(10.0); // Use member function to set it.
cout << "Width of box : " << box.getWidth() <<endl;
return 0;
}
以上代码的输出:
Length of box : 10
Width of box : 10
答案 3 :(得分:0)
由于访问控制适用于名称,因此应用访问控制 到typedef名称,只有typedef名称本身的可访问性 被认为。 实体的可访问性 typedef 是不。
class A {
class B { };
public:
typedef B BB;
};
void f() {
A::BB x; // OK, typedef name A::BB is public
A::B y; // access error, A::B is private
}
因此,并不意味着您的类型是公共的会使成员变量具有公共访问权限。 typedef
用于命名类型非以指定成员的访问权限。
答案 4 :(得分:0)
类型成员与数据成员不同。它更像是静态的东西,我无法通过实例访问它。因此,将其定义为公共或私人,决定我是否可以通过Screen::pos
访问它。那就是它。