class A 
{
    float m_Period; // a1
    float m_Scale;  // a2
};
我可以像这样指向数据成员:
float A::*pFloat;
由于循环中句柄成员的原因,我需要一组这样的指针.这该怎么做.
我在使用C++类时遇到了这个问题.我想获得指向myBar对象的指针并存储它quxBar.原因是我希望能够检查使用的值,quxBar->getX()但我也想防止从Qux中意外地使用它,所以我尝试使用Bar const*.
class Bar
{
private:
    int x;
public:
    void setX(int X) { x = X; };
    int getX(){ return x };
}
class Foo
{
private:
    Bar *myBar;
public: 
    Bar const* getPointerToBar(){ return myBar; };            
}
class Qux
{
    void myMethod();
    Bar const* quxBar;
    Foo *mainFoo;    
}
void Qux::myMethod()
{
    quxBar = mainFoo->getPointerToBar();
    std::cout << quxBar->getX();
    quxBar->setX(100);  // HERE!!!
    std::cout << quxBar->getX(); // returns 100
}
不幸的是它不起作用,因为我仍然能够执行quxBar->setX(100)没有编译错误.
可能我的方法是完全错误的,但使用当前的"技能":)我不知道如何解决它.
提前感谢您的任何帮助和建议.
我是功能指针的新手,我希望得到你的帮助.我有一个方法:
int test3(int i)
{
    return i;
}
然后在另一种方法(不是主要的)我这样做:
int (*pTest3)(int) = test3;
从我读过的例子来看,这似乎没问题.但是,我得到一个编译时错误:
testFile.cpp:277:25:error:类型'int({anonymous} :: CheckingConsumer ::)(int)'的参数与'int(*)(int)'不匹配
我不明白出了什么问题.任何帮助,将不胜感激.
非常感谢.
免责声明我不允许使用BOOST或任何其他库,只能使用标准版.
在我的类中,Foo我有一个模板函数foo,它有两个参数:指向对象的指针和指向此对象成员函数的指针.foo正如您所见,该函数适用于任何类的指针.我不知道,会传给哪一堂课.此函数创建模板结构的实例.
template <typename TypeName>
struct Bar
{
    void(TypeName::*action)();
    TypeName* objPtr;
};
template <typename TypeName> void Foo::foo ( void(TypeName::*action)() , TypeName* objPtr )
{
    Bar <TypeName> bar;
    bar.action = action;
    bar.objPtr = objPtr;
};
我的问题是:如何存储Bar,创建的对象foo,以便稍后我可以迭代它们并调用指针到对象成员函数,如下所示:
(BarStorage[i].objPtr->*BarStorage[i].action)();
试图优化fun_a1()功能.变量j的范围不会改变fun_a1().因此,对于每个'i'迭代检查j == 1或2或3显然是浪费CPU周期.但是如果我尝试将条件评估带到循环之外,我必须为每个条件编写冗余循环.在C中,我可以通过使用函数指针轻松解决这个问题.但是,C++不允许指向非静态函数.我找到了一些描述神秘的"指向成员指针"的链接.(示例1,示例2)但是我仍然不清楚如何从对象本身内部使用它,例如从fun_a()里面?或者它可以以任何其他方式进行优化?
class A{
    void fun_b(int i);
    void fun_c(int i);
    void fun_d(int i);
    void fun_f(int i);
    void fun_a1(int j){
        for(int i=0; i<1000; i++){
                 if(j==1) fun_b(i);
            else if(j==2) fun_c(i);
            else if(j==3) fun_d(i);
            fun_f(i);           
        }
    }
    void fun_a2(int j){
        if(j==1){           
            for(int i=0; i<1000; i++) { 
                fun_b(i); 
                fun_f(i); 
            }
        }
        else if(j==2){          
            for(int i=0; i<1000; i++) { 
                fun_c(i);
                fun_f(i);
            }            
        }
        else if(j==3){
            for(int i=0; i<1000; i++) { 
                fun_d(i);           
                fun_f(i);
            }           
        } …我有一个简单的结构,我想要一个指向成员的指针c.我正在使用MSVC2012,如果我没有将struct abc声明为类型定义(typedef),我就不能使用它..怎么来的?
struct abc
{
    int a;
    int b;
    char c;
};
char (struct abc)::*ptt1 = &(struct abc)::c; // Error: error C2144: syntax error : 'abc' should be preceded by ')'
typedef struct abc;
char abc::*ptt1 = &abc::c; // Compiles just fine
我有一个struct(Member),它只能用作其他struct(Container)中的数据成员.按照惯例,成员的名字总是m.成员是否有可靠的方法来获取包含结构的地址?
template<typename Struct>
struct Member;
{
  const Struct& s = ??;
                    // this - &Struct::m
};
struct Container
{
   Member<Container> m;
};
我希望可能使用指向成员的指针&Container::m可能有助于从Member对象本身的地址计算回来?
我正在尝试做一些看起来应该相当常见的事情,但我找不到任何人讨论它。 stackoverflow 上的这篇文章与我想要做的类似,但不完全相同。
我有一个抽象基类:
#ifndef _ABASECLASS_H_
#define _ABASECLASS_H_
using namespace std;
#include <iostream>
#define CALL_MBR_FUNC(object, ptr_to_mem_func) ((object).*(ptr_to_mem_func))
class aBaseClass
{
public:
  typedef void (aBaseClass::*aBaseClass_mem_func)();
  int A;
  int B;
  aBaseClass();
  aBaseClass(int a, int b);
  virtual void function1(aBaseClass_mem_func infunc) = 0; 
  virtual void function2() = 0; 
};
#endif /* _ACLASS_H_ */
我有一个派生类:
#ifndef _ASUBCLASS_H_
#define _ASUBCLASS_H_
using namespace std;
#include <iostream>
#include "aBaseClass.h"
/* A simple class containing two ints and some functions to demonstrate passing via various methods. …C++ 允许定义指向类成员的指针,例如:
struct A
{
  int i;
};
void a()
{
  int A::*p = &A::i;
}
但是如果我想要一个指向像这样更深“级别”的成员的指针怎么办?
struct A
{
  int i;
  struct B{int j;};
  B b;
};
void a()
{
  int A::*p = &A::b::j;
}
从理论上讲,如果指向成员的指针从对象的开头编译为偏移,这可能很容易被语言支持,尽管像虚拟/钻石继承这样的事情可能会使这变得太复杂
在没有性能损失或未定义行为的情况下实现这一目标的最简单方法是什么?
我的第一个想法是只使用偏移量并使用对象上的原始指针,但这似乎不是定义的行为,并且也会使编译器无法检测我是否指向具有正确类型的实际字段
我想创建一个指向方法的指针数组,这样我就可以根据整数快速选择要调用的方法。但我在语法上有点挣扎。
\n我现在拥有的是这样的:
\nclass Foo {\n     private:\n        void method1();\n        void method2();\n        void method3();\n\n        void(Foo::*display_functions[3])() = {\n            Foo::method1,\n            Foo::method2,\n            Foo::method3\n        };\n};\n但我收到以下错误消息:
\n[bf@localhost method]$ make test\ng++     test.cpp   -o test\ntest.cpp:11:9: error: cannot convert \xe2\x80\x98Foo::method1\xe2\x80\x99 from type \xe2\x80\x98void (Foo::)()\xe2\x80\x99 to type \xe2\x80\x98void (Foo::*)()\xe2\x80\x99\n   11 |         };\n      |         ^\ntest.cpp:11:9: error: cannot convert \xe2\x80\x98Foo::method2\xe2\x80\x99 from type \xe2\x80\x98void (Foo::)()\xe2\x80\x99 to type \xe2\x80\x98void (Foo::*)()\xe2\x80\x99\ntest.cpp:11:9: error: cannot convert \xe2\x80\x98Foo::method3\xe2\x80\x99 from type \xe2\x80\x98void (Foo::)()\xe2\x80\x99 to type \xe2\x80\x98void (Foo::*)()\xe2\x80\x99\nmake: *** [<builtin>: test] Error 1\n鉴于以下代码,我无法编译.
    template < typename OT, typename KT, KT (OT::* KM)() const >
    class X
    {
    public:
        KT mfn( const OT & obj )
        {
            return obj.*(KM)();    // Error here.
        }
    };
    class O
    {
    public:
        int func() const
        {
            return 3;
        }
    };
    int main( int c, char *v[] )
    {
        int a = 100;
        X<  O, int, &O::func > x;
        O o;
        std::cout << x.mfn( o ) << std::endl;
}
我收到了folling错误消息
error: must use '.*' or '->*' to call …c++ templates member-function-pointers function-pointers pointer-to-member
我遇到了这段代码:
 auto f3 = std::bind(&Foo::print_sum, &foo, 95, _1);
在前面的代码中,我们可以将地址运算符应用于成员函数,而没有创建实例对象,这怎么可能?
以下是我正在尝试做的事情的基本想法。我有一个外部库,我想在现有项目中使用它。当然,我无法更改外部库中的任何内容或现有项目中的主要功能。
我面临的问题是如何将我在类中创建的回调函数作为函数指针传递给这个外部函数。同时,此回调函数必须有权访问该类的成员,因此我不能简单地将其设为静态。我该怎么做?
Class ExternalClass //This I cannot mess with.
{
    //somestuff
    void ExternalFunc (void(* callback)(int, const void*), const void *);
}
Class MyClass
{
    //somestuff
    ExternalClass m_ExObj;
    void Callback(int x, const void *p){
        //dosomething
        //How do I use this pointer ?
    }
    void MyFunc(){
        m_ExObj.ExternalFunc(/*Some way to put MyClass::Callback() in here*/)
    }
}