我在看一个成员函数
int funct(int x) const;
Run Code Online (Sandbox Code Playgroud)
而且我想知道是否
static int funct(int x);
Run Code Online (Sandbox Code Playgroud)
会更好.
如果成员函数不使用任何成员变量,那么它应该是静态的.有什么东西可以阻止这个吗?
这是一个最小的工作示例:
啊:
class A{
static int a_member_function();
};
Run Code Online (Sandbox Code Playgroud)
A.cpp
#include "A.h"
int A::a_member_function(){return 5;}
int main(){ return 1;}
Run Code Online (Sandbox Code Playgroud)
这段代码编译并运行,但在我看来:
static int A::a_member_function(){return 5;}
Run Code Online (Sandbox Code Playgroud)
可以很容易地用来定义类A的静态成员函数.实际上,似乎它实际上对于满足这个要求是非常有用的,因为它会提醒读者.cpp文件a_member_function是静态的.
但是,这显然不起作用:
error: cannot declare member function ‘static int A::a_member_function()’ to have static linkage [-fpermissive]
Run Code Online (Sandbox Code Playgroud)
那为什么不起作用呢?这个决定背后的原因是什么?
正如您所知,在Java 8中,接口可以拥有静态方法,这些方法本身就具有实现.
正如我在相关教程中所读到的,实现此类接口的类可以使用其静态方法.但是,我有一个问题,在这里,我用一个比我更简单的例子来展示它
public interface Interface1{
public static void printName(){
System.out.println("Interface1");
}
}
Run Code Online (Sandbox Code Playgroud)
当我实现这样的接口
public class Class1 implements Interface1{
public void doSomeThing() {
printName();
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到编译错误.
The method printName() is undefined for the type Class1
Run Code Online (Sandbox Code Playgroud)
有什么问题?
我知道关于如何在服务和活动之间进行通信的问题已被多次回答,但我也希望我自己的方式对此进行审核,并了解它是否是可接受的和正确的方法来执行此操作以及什么是我如何处理它的弊端.首先,我将尽可能详细地陈述问题陈述.
我必须构建一个应用程序,我使用Firebase Messaging Service在两个设备之间进行通信.让我们说它是一个类似Uber的系统.一个应用程序用于服务提供商(驱动程序),一个用于客户(乘客).当乘客请求使用其位置旅行时,某个半径范围内的驾驶员将使用Firebase获得有效负载的推送通知.Firebase服务正在后台运行.当服务收到推送通知时,onMessageReceived将调用方法.生成一个事件.我不是在这里使用Firebase来生成通知,但实际上在我需要使用dataFirebase推送通知字段时在设备之间传输数据.现在,驱动程序应用程序将在Firebase推送通知的有效负载中接收用户想要汽车的坐标.我可以简单地在附加内容中使用此数据启动活动,并向驱动程序显示已收到请求.
现在在客户方面,在客户提交请求之后,他们将被带到下一个活动,在那里他们将被显示一种加载屏幕,告诉他们等待其中一个驱动程序接受他们的请求.当其中一个驱动程序接受此用户的请求时,此用户现在将在推送通知的有效负载中收到带有指定驱动程序信息的Firebase推送通知.同样,目的不是生成任何通知,而是在设备之间传输数据.
既然您了解了用例,我将继续讨论该问题.
当用户提交请求并进入下一个等待屏幕时会出现问题,在该屏幕上显示一个加载屏幕,告诉他们在请求等待其中一个驱动程序接受时等待.当驱动程序接受请求时,正如我所说,用户将在推送通知的有效负载中收到带有驱动程序信息的Firebase推送通知.如何在服务和活动之间进行通信,告诉活动停止显示加载屏幕并使用推送通知的有效负载中接收的数据填充TextView.
这是我如何处理这个.假设我有一个名称的活动AwaitingDriver,其中TextView将由驱动程序的数据填充.但目前活动正在显示加载屏幕,因为该请求尚未被接受.现在,用户收到推送通知,其中包含在后台运行的服务中的驱动程序信息,而不是以任何方式连接到活动.这是我的onMessageReceived方法
@Override
public void onMessageReceived(RemoteMessage remoteMessage){
SharedPreferences rideInfoPref = getSharedPreferences(getString(R.string.rideInfoPref), MODE_PRIVATE);
SharedPreferences.Editor rideInfoPrefEditor = rideInfoPref.edit();
String msgType = remoteMessage.getData().get("MessageType");
if (msgType.equals("RequestAccepted")){
rideInfoPrefEditor.putBoolean(getString(R.string.is_request_accepted), true);
rideInfoPrefEditor.putString(getString(R.string.driver_phone), remoteMessage.getData().get("DriverPhone"));
rideInfoPrefEditor.putString(getString(R.string.driver_lat), remoteMessage.getData().get("DriverLatitude"));
rideInfoPrefEditor.putString(getString(R.string.driver_lng), remoteMessage.getData().get("DriverLongitude"));
rideInfoPrefEditor.commit();
AwaitingDriver.requestAccepted(); // A static method in AwaitingDriver Activity
}
}
Run Code Online (Sandbox Code Playgroud)
这AwaitingDriver.requestAccepted()是一种静态的AwaitingDriver活动方法.在AwaitingDriver活动本身内部,它显示了一个告诉客户等待的进度对话框,这是方法AwaitingDriver.requestAccepted()正在做的事情.
public static void requestAccepted(){
try{
awaitingDriverRequesting.dismiss(); //ProgressDialog for telling user to wait
}catch (Exception e){
e.printStackTrace(); …Run Code Online (Sandbox Code Playgroud) android static-methods android-asynctask firebase android-service-binding
我一直在阅读当你尝试在项目中实现单元测试时,静态方法,静态类和单例是邪恶的.在遵循TDD范例时,我是否应该忘记它们曾经存在过并且从未再次使用它们,或者有时可以使用它们吗?
来自Java背景,对我来说,处理创建类的选择或者只是实现我可能需要的函数是新的.通常,在建模可能具有状态的东西时,这是毫无疑问的.
现在我正在实现一个没有main函数和静态成员函数的共享库.是否有些东西反对创建一个类来封装函数?
此外,我想在另一个文件中封装更多代码,尤其是辅助功能.执行代码总是相同的,并且它的状态不会改变,所以我想我会声明它们也是静态的 - 所以这里出现了同样的问题.
我想从静态方法访问静态变量:
#!/usr/bin/env python
class Messenger:
name = "world"
@staticmethod
def get_msg(grrrr):
return "hello " + grrrr.name
print Messenger.get_msg(Messenger)
Run Code Online (Sandbox Code Playgroud)
没有传递grrrr给方法怎么做?这是真正的OOP吗?
任何喜欢name或self.name似乎不起作用的东西:
NameError: global name 'name' is not defined
Run Code Online (Sandbox Code Playgroud)
和
NameError: global name 'self' is not defined
Run Code Online (Sandbox Code Playgroud) 我有一个包含许多类的Python模块,每个类代表具有其属性的特定物理材料(例如,密度,比热).一些属性只是float类的成员,但很多属性依赖于某些参数,例如温度.我通过@staticmethods 实现了这一点,即所有类看起来都像
class Copper(object):
magnetic_permeability = 1.0
@staticmethod
def density(T):
return 1.0 / (-3.033e-9 + 68.85e-12*T - 6.72e-15*T**2 + 8.56e-18*T**3)
@staticmethod
def electric_conductivity(T, p):
return 1.0141 * T**2 * p
@staticmethod
def specific heat(T):
return ...
class Silver(object):
...
class Argon(object):
...
...
Run Code Online (Sandbox Code Playgroud)
因此,Classes仅仅充当所有数据的容器,并且@staticmethods 的丰富性让我怀疑这个用例可能有更合适的设计模式.
任何提示?
我想知道你是否有一个只有静态方法的类,当你调用第一个静态方法时,是否会在某个地方创建一个类的实际实例?
这在内存管理方面有点令人困惑,因为您从未实际调用构造函数或显式创建方法的实例.
如果确实创建了一个实例,我想更好地了解这个实例的存在位置和持续时间.
我有这个问题,因为单例/命名构造函数.在这两种情况下,真正的构造函数都是受保护的或私有的,两者都不能从外部访问.
例如,一个简短的命名构造函数是这样的:
class A
{
public:
static A createA() { return A(0); } // named constructor
private:
A (int x);
};
int main(void)
{
A a = A::createA();
}
Run Code Online (Sandbox Code Playgroud)
我认为静态方法只能访问静态数据成员,或通过现有对象访问私有数据/方法.但是,在上面的代码中,私有构造函数A()不是静态的,并且在调用它时,也不存在任何对象.所以我能想到的唯一解释是静态方法可以访问同一个类的非静态私有方法.任何人都可以肯定或否定我的想法,可能有一些解释?
我很抱歉,如果这太微不足道,但关键词太常见了,我无法在几十个谷歌页面找到答案.提前致谢.