我坚持使用模板和范围解析运算符.我在文件中找到了这些行,我无法弄清楚为什么我们在模板函数调用前使用::据我所知,我们只能在引用全局变量时使用::在变量前面.任何想法都会有所帮助
#define CREATE_AND_DECODE_TYPE(Type, buffer, pType) \
::CreateAndDecodeType<Type>(buffer, pType, throwVarBindExceptions, static_cast<Type *>(NULL))
Run Code Online (Sandbox Code Playgroud) 我遇到了这段代码.
class SomeClass::OtherClass : public BaseClass
{
// stuff in here
}
Run Code Online (Sandbox Code Playgroud)
SomeClass是一个类,所以也许OtherClass是一个存在于SomeClass范围内的类?我从来没有见过这样做过.
那么,这意味着什么?
我想在我的简单ORM中用PHP实现一个钩子系统:
class Record {
public function save() {
if (method_exists($this,"before_save")) {
$this->before_save();
}
//...Storing record etc.
}
}
class Payment extends Record {
private function before_save() {
$this->payed_at = time();
}
}
$payment = new Payment();
$payment->save();
Run Code Online (Sandbox Code Playgroud)
这会导致致命错误:
致命错误:从上下文'记录'中调用私有方法Payment :: before_save()
说得通.
我可以将范围改为公开,但这看起来很丑陋:没有人,但付款与此有关before_save().最好是私人,恕我直言.
如何在从Record继承的类上使Record调用一个私有方法?
在 PHP 中,你可以这样做:
class myClass() {
function doSomething(someVar) {
// do something here
}
// etc... (other methods and properties)
}
Run Code Online (Sandbox Code Playgroud)
然后,当然,您可以在实例化类后调用该方法,如下所示:
$myObj = new myClass();
$myObj->doSomething();
Run Code Online (Sandbox Code Playgroud)
但是您也可以选择将该方法作为独立函数调用,而无需实例化该类(但您必须注意该函数中的依赖项),如下所示:
myClass::doSomething();
Run Code Online (Sandbox Code Playgroud)
我相信它是为 C++ 借来的东西......它被称为范围解析运算符(PHP 代码中的 Paamayim Nekudotayim......)
http://en.wikipedia.org/wiki/Scope_resolution_operator#PHP
http://www.php .net/manual/en/language.oop5.paamayim-nekudotayim.php
你会如何在 JavaScript 中做这样的事情?这似乎是不可能的。也许我以错误的方式接近这个,我应该透露我想要实现的目标......
我只有一个函数,它是这样的:
function submitContactForm(form) {
// pretty JavaScript...
}
Run Code Online (Sandbox Code Playgroud)
我很高兴它是一个函数。但我想实现一个“resetContactForm()”,但希望以某种方式将它附加到 submitConatctForm 函数。
我知道我可能会这样做:
var contactForm = {
"submit" : function(form) {
//...
},
"reset" : function(form) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
我会像那样回答我自己的问题......
但是,除了我不喜欢这种语法,并想避免它之外,还有一个事实是,上面的结构不能用作类定义,它与 PHP 中的不一样......所以回到最初的问题:有没有办法让 JavaScript 结构可以同时用作类定义和独立函数的集合?
我正在阅读一本关于C语言的书('掌握C'),并::在此处找到了有关范围解析运算符()的主题,请参阅第203页的Google Books .
但是当我运行以下代码示例(从本书中复制)时,C编译器给了我一个错误.我在互联网上搜索但我无法在C中找到任何对范围解析运算符的引用.
#include <stdio.h>
int a = 50;
int main(void)
{
int a =10;
printf("%d",a);
printf("%d\n", ::a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以,如果我想访问一个全局变量,那我怎么能从main()函数中做到这一点呢?
当我尝试访问我的静态变量时,Class.Variable我得到了错误,Error left of 'Variable' must have class/struct/union当我这样做时,我没有Class::Variable得到任何错误.虽然在这两种情况下我都Variable通过智能感知.到底是什么之间的不同.而::在这种情况下?
如何从定义具有相同名称的成员函数的类中调用非成员函数listen()(包括在内sys/socket.h)listen()?
#include <sys/socket.h>
void Socket::listen(int port)
{
...
listen(sock_fd, 10); // this doesn't work
}
Run Code Online (Sandbox Code Playgroud) C++
给定基类Base和派生类Derived,构造函数构造的第一件事Derived是Base子对象.由于它被称为子对象,我认为可以通过在对象上使用点运算符从客户端代码访问它,就像任何其他成员对象一样Derived.我还假设它可以通过Derived实现代码访问this->Base.完全由已经初始化后跟分号的对象的名称组成的语句应该编译但是也没有效果.继这一逻辑,给定一个Derived目标myderived,我想:myderived.Base;在客户端代码和this->Base;中Derived的实现也不言编译.
为什么?我知道Base,它本身就是Base类的名称,而不是Base对象的名称.但我认为Base由myderived.(客户端代码)或this->(实现代码)前缀限定引用基础子对象,因为Base没有任何前缀限定,是在构造函数初始化程序中Base引用子对象的方式Derived.请参阅下面的代码,其中(注释掉的代码旁边)适用于VC12和g ++ 4.8.Derivedextends Base和Derived的定义声明了一个Base数据成员membase,所以我的Derived对象应该包含两个Base对象.假设成功编译不是任何编译器 - 标准 - 不符合的结果,控制台输出(在注释中)显示两个不同对象的int成员的不同值,意味着在's ctor初始化器中,指的是继承的子对象,而引用声明的数据成员对象.在's ctor初始化器中,具体指的是继承的子对象,而不仅仅是任何对象或类.nBaseDerivedBaseBasemembaseDerivedBaseBaseBase
#include …Run Code Online (Sandbox Code Playgroud) 我在C++中遇到了以下代码结构:
uint32_t AClass::Action(....)
{
..
status = ::Action(...);
..
}
Run Code Online (Sandbox Code Playgroud)
我不确定是什么::Action()意思.它属于哪个类?注意:参数列表::Action(...)不同于AClass::Action(...).
我不能想到::用于指定范围会导致生成任何代码的情况.我能想到的其他所有运算符(至少在概念上)都会生成代码,它会"做某事".
那么,为什么::称它为"范围解析运算符" ,而它绝不像运算符那样.它似乎更对我来说,一个名称的一部分,有些词汇绒毛样的...或者<和>周围的模板参数列表,甚至;.没人会调用;'表达式终止运算符'.
是否有一个特定的原因,它被称为(标准关于它在某种程度上像运算符的行为将在这里顺序)?或者这个名字只是历史包袱?
scope-resolution ×10
c++ ×7
class ×2
namespaces ×2
oop ×2
php ×2
scope ×2
c ×1
dot-operator ×1
inheritance ×1
javascript ×1
static ×1
templates ×1